Questão nº 37
Questão de Tecnologia da Informação · FGV TCE-SP 2023 (nº 37)
Quando referidas, considere as tabelas relacionais TX e TY, criadas e instanciadas com o script SQL a seguir.
create table TY(C int primary key not null, A int) create table TX(A int primary key not null, B int, foreign key (B) references TY(C) on delete cascade ) insert into TY values (1,0) insert into TY(C) values (2) insert into TY(C) values (3) insert into TY values (5,NULL) insert into TY values (6,NULL) insert into TX values (1,2) insert into TX values (2,1) insert into TX values (3,2) insert into TX values (4,2)
Com referência às tabelas TX e TY, como descritas anteriormente, analise o comando SQL a seguir.
select count(*)
from TX t1 left join TY t2 on t1.B=t2.A
O valor exibido pela execução desse comando é:
- A0;
- B2;
- C3;
- D4; (alternativa correta)
- E6.
Resposta comentada
Gabarito Alternativa D
O LEFT JOIN (ou LEFT OUTER JOIN) retorna todas as linhas da tabela da esquerda (a primeira tabela mencionada, TX neste caso), e as linhas correspondentes da tabela da direita (TY) que satisfazem a condição ON. Se não houver correspondência na tabela da direita para uma linha da tabela da esquerda, as colunas da tabela da direita serão preenchidas com NULL. O COUNT(*) simplesmente conta o número total de linhas resultantes dessa operação de junção.
Vamos analisar as tabelas e a junção:
Tabela TY:
C | A
--|---
1 | 0
2 | NULL
3 | NULL
5 | NULL
6 | NULL
Tabela TX:
A | B
--|---
1 | 2
2 | 1
3 | 2
4 | 2
A condição de junção é t1.B = t2.A.
Vamos verificar para cada linha de TX (tabela da esquerda):
- TX (A=1, B=2): Procura em
TYporA = 2.- Em
TY, os valores da colunaAsão0ouNULL. Não háA = 2. - Resultado da junção para esta linha:
(1, 2, NULL, NULL)(linha deTX+NULLs paraTY).
- Em
- TX (A=2, B=1): Procura em
TYporA = 1.- Em
TY, os valores da colunaAsão0ouNULL. Não háA = 1. - Resultado da junção para esta linha:
(2, 1, NULL, NULL)(linha deTX+NULLs paraTY).
- Em
- TX (A=3, B=2): Procura em
TYporA = 2.- Em
TY, os valores da colunaAsão0ouNULL. Não háA = 2. - Resultado da junção para esta linha:
(3, 2, NULL, NULL)(linha deTX+NULLs paraTY).
- Em
- TX (A=4, B=2): Procura em
TYporA = 2.- Em
TY, os valores da colunaAsão0ouNULL. Não háA = 2. - Resultado da junção para esta linha:
(4, 2, NULL, NULL)(linha deTX+NULLs paraTY).
- Em
Como é um LEFT JOIN, todas as 4 linhas da tabela TX (a tabela da esquerda) são mantidas no resultado final. Como nenhuma delas encontrou uma correspondência na tabela TY com base na condição t1.B = t2.A (pois os valores de t1.B são 1 e 2, e os valores de t2.A são 0 ou NULL, e NULL não corresponde a nada em uma comparação de igualdade), as colunas de TY são preenchidas com NULL para cada linha.
O COUNT(*) então conta o número de linhas no resultado dessa junção. Há 4 linhas resultantes.
(A) Incorreta: O LEFT JOIN garante que todas as linhas da tabela da esquerda sejam incluídas no resultado, mesmo que não haja correspondência na tabela da direita.
(B) Incorreta: O número de linhas da tabela da esquerda é 4.
(C) Incorreta: O número de linhas da tabela da esquerda é 4.
(D) Correta: O LEFT JOIN retorna todas as 4 linhas da tabela TX (a tabela da esquerda). Como a condição t1.B = t2.A não encontra nenhuma correspondência em TY (pois os valores de t1.B são 1 e 2, e os de t2.A são 0 ou NULL), as colunas de TY são preenchidas com NULL para cada linha de TX. O COUNT(*) simplesmente conta essas 4 linhas resultantes. A armadilha aqui é confundir o comportamento do LEFT JOIN com o de um INNER JOIN; um INNER JOIN resultaria em 0 linhas, mas o LEFT JOIN sempre retorna todas as linhas da tabela da esquerda.
(E) Incorreta: O número de linhas da tabela da esquerda é 4.
Fonte: FGV TCE-SP 2023 Agente da Fiscalização - TI (Caderno Tipo 1). Reproduzida para fins de estudo.