Considere um banco de dados que contém três tabelas, T1, T2 e T3, criadas com os comandos que seguem. CREATE TABLE T1 (A int) CREATE TABLE T2 (A int UNIQUE) CREATE TABLE T3 (A int) Dado que as três tabelas contêm 50, 100 e 200 linhas, respectivamente, assinale o mínimo possível de linhas que poderiam ser produzidas pelo comando exibido abaixo. SELECT * FROM T1 UNION SELECT * FROM T1 UNION SELECT * FROM T1
- A)0
Errada, porque o UNION elimina duplicidades e sempre pode retornar pelo menos uma linha se a tabela tiver algum valor.
- B)1
Certa, porque as 50 linhas de T1 podem ser todas iguais, e o UNION mantém apenas o valor distinto, gerando 1 linha.
- C)50
Errada, porque 50 é o total de linhas de T1, mas o UNION não conta linhas repetidas três vezes.
- D)100
Errada, porque 100 não decorre da operação UNION; repetir a mesma consulta não multiplica o resultado por 2.
- E)200
Errada, porque 200 é o número de linhas de T3 e não tem relação com a consulta feita apenas sobre T1.
Gabarito: B
Aqui o ponto central é lembrar a diferença entre UNION e UNION ALL. O UNION faz a união dos resultados e ainda elimina duplicidades, ou seja, ele devolve apenas linhas distintas. Então, quando voce escreve `SELECT * FROM T1 UNION SELECT * FROM T1 UNION SELECT * FROM T1`, o banco junta os três resultados, mas no fim remove tudo que estiver repetido. Como a tabela T1 tem apenas uma coluna, A, o menor número possível de linhas produzidas depende de quantos valores distintos existem nela. Mesmo tendo 50 linhas, nada impede que as 50 tenham o mesmo valor em A. Nesse cenário, o resultado do UNION terá só 1 linha distinta. Por isso o gabarito B está correto: o mínimo possível é 1. A questão não pede o que acontece em uma tabela qualquer, mas sim o menor resultado possível dentro das regras do SQL. Aqui, a palavra mágica é justamente "UNION", que não deixa passar duplicatas como se nada tivesse acontecido.