SQL: produto cartesiano com autojunção e condição de junção
Gabarito: letra B. O comando select * from R1 x, R1 y where x.A > y.A and x.B = y.B executa um produto cartesiano da tabela R1 consigo mesma (autojunção) e, em seguida, filtra as combinações em que o valor de A da primeira ocorrência é maior que o de A da segunda, e os valores de B são iguais. Analisando a instância da tabela, apenas um par de linhas satisfaz essas condições, resultando em 1 linha no resultado.
O comando SQL apresentado é uma autojunção (self-join) explícita, escrita na sintaxe antiga de junção, onde as tabelas são listadas na cláusula FROM separadas por vírgula e a condição de junção é colocada na cláusula WHERE. Essa sintaxe equivale a um INNER JOIN com a condição especificada. O produto cartesiano entre a tabela R1 e ela mesma gera todas as combinações possíveis de pares de linhas (x, y). Se a tabela R1 tem n linhas, o produto cartesiano terá n² combinações. No entanto, a condição WHERE restringe esse resultado, mantendo apenas os pares que atendem aos critérios.
Para resolver a questão, é necessário conhecer a instância da tabela R1. A tabela R1 possui as colunas A e B, e seus valores são:
Vamos analisar o produto cartesiano e aplicar a condição. O produto cartesiano gera 3 × 3 = 9 pares (x, y). A condição x.A > y.A and x.B = y.B exige que, para cada par, o valor de A da linha x seja estritamente maior que o valor de A da linha y, e que os valores de B sejam iguais.
Vamos testar cada par:
(x=(1,2), y=(1,2)): x.A=1 > y.A=1? Não.
(x=(1,2), y=(2,2)): x.A=1 > y.A=2? Não.
(x=(1,2), y=(3,1)): x.A=1 > y.A=3? Não.
(x=(2,2), y=(1,2)): x.A=2 > y.A=1? Sim. x.B=2 = y.B=2? Sim. Atende.
(x=(2,2), y=(2,2)): x.A=2 > y.A=2? Não.
(x=(2,2), y=(3,1)): x.A=2 > y.A=3? Não.
(x=(3,1), y=(1,2)): x.A=3 > y.A=1? Sim. x.B=1 = y.B=2? Não.
(x=(3,1), y=(2,2)): x.A=3 > y.A=2? Sim. x.B=1 = y.B=2? Não.
(x=(3,1), y=(3,1)): x.A=3 > y.A=3? Não.
Apenas o par (x=(2,2), y=(1,2)) atende a todas as condições. Portanto, o resultado tem 1 linha.
A pegadinha dessa questão está em não considerar corretamente a condição de junção. Muitos candidatos podem contar apenas os pares em que x.A > y.A, esquecendo de verificar a igualdade de B, ou podem errar ao considerar a comparação como >= em vez de >. Além disso, é comum confundir a autojunção com uma junção entre tabelas diferentes, mas o raciocínio é o mesmo.
Alternativa A — ❌ Incorreta
Afirma que o resultado tem 0 linhas. Isso estaria correto se nenhum par atendesse à condição, mas o par (x=(2,2), y=(1,2)) atende, pois 2 > 1 e 2 = 2. Portanto, há pelo menos uma linha.
Alternativa B — ✅ Correta ⟵ GABARITO
Como demonstrado, apenas o par (x=(2,2), y=(1,2)) satisfaz x.A > y.A e x.B = y.B. Logo, o comando retorna exatamente 1 linha. A alternativa está correta.
Alternativa C — ❌ Incorreta
Afirma que o resultado tem 2 linhas. Isso ocorreria se houvesse dois pares distintos atendendo à condição. No entanto, apenas um par atende. O candidato pode ter contado também o par (x=(3,1), y=(1,2)) por engano, mas nesse par os valores de B são diferentes (1 ≠ 2), então ele é descartado.
Alternativa D — ❌ Incorreta
Afirma que o resultado tem 3 linhas. Isso seria o número de linhas da tabela original, mas não o número de linhas do resultado da consulta. O candidato pode ter confundido o número de linhas da tabela com o número de linhas do resultado.
Alternativa E — ❌ Incorreta
Afirma que o resultado tem 4 linhas. Não há fundamento para esse número. O produto cartesiano tem 9 combinações, mas a condição restringe a apenas 1. O candidato pode ter contado os pares em que x.A > y.A sem verificar a igualdade de B, o que daria 3 pares (x=(2,2), y=(1,2); x=(3,1), y=(1,2); x=(3,1), y=(2,2)), mas ainda assim não seriam 4.
Gabarito: letra B