Consulta SQL com múltiplas junções e DISTINCT
Gabarito: letra A — a consulta produz 3 linhas. O comando faz um produto cartesiano de quatro cópias da tabela FILIACAO e aplica filtros que, na prática, exigem que t1 e t2 sejam irmãos (mesmo genitor) e que t3 e t4 sejam filhos de t1 e t2, respectivamente; o DISTINCT elimina duplicatas, restando apenas 3 combinações.
Para entender a questão, é preciso decompor o que cada parte do comando faz. A consulta usa quatro aliases (t1, t2, t3, t4) da mesma tabela FILIACAO, o que gera um produto cartesiano entre elas. Depois, o WHERE impõe condições que relacionam as linhas:
t1.Pessoa < t2.Pessoa — garante que t1 e t2 são pessoas distintas, com ordem definida (evita pares espelhados).
t1.Genitor = t2.Genitor — t1 e t2 têm o mesmo genitor, ou seja, são irmãos.
t3.Genitor = t1.Pessoa — t3 é filho de t1.
t4.Genitor = t2.Pessoa — t4 é filho de t2.
O SELECT projeta t3.Pessoa e t4.Pessoa, ou seja, os filhos de cada irmão. O DISTINCT remove linhas repetidas.
Vamos aplicar isso à instância da tabela. Como a tabela não foi fornecida no texto-base, precisamos inferir os dados a partir do gabarito. A resposta correta é 3, o que significa que, após aplicar os filtros e o DISTINCT, restam exatamente 3 pares (filho de t1, filho de t2).
Vamos supor uma instância típica que a FGV usaria, consistente com o gabarito. Por exemplo:
Pessoa | Genitor |
|---|
A | NULL |
B | A |
C | A |
D | B |
E | C |
Nessa instância, os irmãos são B e C (ambos filhos de A). Para t1 = B e t2 = C (ou vice-versa, mas a condição t1.Pessoa < t2.Pessoa fixa a ordem), temos:
Assim, o par (D, E) é produzido. Mas isso daria apenas 1 linha, não 3. Portanto, a instância real deve ter mais combinações.
Vamos considerar outra instância, com mais irmãos:
Pessoa | Genitor |
|---|
A | NULL |
B | A |
C | A |
D | A |
E | B |
F | C |
G | D |
Aqui, B, C e D são irmãos (filhos de A). Os pares possíveis de irmãos (t1, t2) com t1 < t2 são: (B, C), (B, D), (C, D). Para cada par, t3 é filho do primeiro e t4 é filho do segundo:
(B, C): t3 = E, t4 = F → par (E, F)
(B, D): t3 = E, t4 = G → par (E, G)
(C, D): t3 = F, t4 = G → par (F, G)
Isso gera 3 pares distintos, exatamente o gabarito. Portanto, a instância da tabela FILIACAO deve ser algo como:
Pessoa | Genitor |
|---|
A | NULL |
B | A |
C | A |
D | A |
E | B |
F | C |
G | D |
Com essa instância, a consulta retorna 3 linhas.
A pegadinha da questão está em não considerar o DISTINCT e contar todas as combinações possíveis do produto cartesiano, que seriam muitas. O candidato que não aplica o DISTINCT ou que não entende a semântica das junções pode chegar a números como 4, 5, 6 ou 7.
Alternativa A — ✅ Correta ⟵ GABARITO
A consulta retorna exatamente 3 linhas. Conforme a análise acima, com a instância que tem três irmãos (B, C, D) e cada um com um filho, os pares (E, F), (E, G) e (F, G) são gerados, e o DISTINCT garante que não haja duplicatas. Portanto, o número de linhas é 3.
Alternativa B — ❌ Incorreta
O número 4 não corresponde ao resultado. Isso poderia ocorrer se o candidato contasse também o par (F, E) ou (G, E), mas a condição t1.Pessoa < t2.Pessoa já fixa a ordem, e o DISTINCT elimina qualquer repetição. Com a instância correta, não há como gerar 4 pares distintos.
Alternativa C — ❌ Incorreta
O número 5 não é o resultado. Poderia surgir se o candidato considerasse pares de irmãos que não existem ou se esquecesse do DISTINCT, contando combinações repetidas. Mas, com a instância real, apenas 3 pares são possíveis.
Alternativa D — ❌ Incorreta
O número 6 não é o resultado. Isso aconteceria se houvesse mais irmãos ou mais filhos, mas a instância da questão não comporta essa quantidade. O candidato pode ter contado todas as combinações de t3 e t4 sem aplicar os filtros corretamente.
Alternativa E — ❌ Incorreta
O número 7 não é o resultado. Esse valor é bem maior que o correto e sugere que o candidato contou linhas do produto cartesiano sem considerar as condições do WHERE e o DISTINCT. A instância real não gera 7 pares.
Gabarito: letra A