Observe o script a seguir, no âmbito do MS SQL Server.create...
create table X(a int identity, b int) insert into X select top 10000 NULL from T t1, T t2 alter table X drop column b select * from X
Dado que existe uma tabela T, com três colunas e 53 registros, a execução desse script gera um resultado contendo:
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: B - uma coluna, com os números de 1 até 2.809.
Para compreender a questão, é necessário entender o funcionamento do SQL Server e os conceitos de identity, cartesian join e manipulação de colunas em tabelas.
A cláusula identity cria uma coluna que gera valores únicos sequenciais automaticamente quando um novo registro é inserido. No caso do script, a coluna a é definida como identity, então ela irá gerar números sequenciais a partir do 1.
O cartesian join, realizado no comando insert, é quando cada linha de uma tabela é combinada com todas as linhas de outra tabela. Aqui, a tabela T é cruzada consigo mesma, o que resulta em 53 * 53 = 2.809 linhas, pois a tabela possui 53 registros.
A instrução select top 10000 indica a intenção de inserir até 10.000 registros, mas devido ao tamanho da tabela T, somente 2.809 são possíveis.
Após a inserção, a coluna b é excluída pelo comando alter table X drop column b, restando apenas a coluna a, que contém os valores de identity que foram inseridos, indo de 1 até 2.809, conforme gerados automaticamente pelo SQL Server.
O comando final select * from X exibirá os resultados da tabela X que, após a exclusão da coluna b, contém apenas a coluna a com os números sequenciais de 1 até 2.809.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
Porque exibe apenas uma coluna está claro, mas como o select analisa duas colunas e cada uma possui 53 registros, 53 x 53 = 2.809, marquei a letra B mas confesso que não entendi. Qual a relação desse cálculo com a resposta? O que ocorre no "select top 10000 null"?
Quando você faz um select com o from para duas tabelas, sem usar join, o resultado é um produto cartesiano das duas. Por isso 53 * 53 = 2.809. O Select top vai pegar os 10.000 primeiros registros, como não possui 10.000, vai trazer os 2.809.
OBS: O NULL serve apenas para não obter nenhum campo específico da tabela, o resultado será 2.809 linhas com NULL.
SELECT TOP number |percent column_name(s)
FROM table_name
WHERE condition;
Para compreender esta, tenha em mente que o TOP é a última coisa a ser executada na ordem de precedência da consulta SQLs.
O autor da questão de aproveitou do fato de que, no SQL Server, a cláusua de limitação de linhas vem entre o SELECT e o FROM. Em outros SGBD seria mais fácil identificar o pega da questão.
Veja um exemplo equivalente no MySQL:
SELECT NULL from T t1, T t2 LIMIT 10000
Neste ponto você já deve ter comprrendido o que aconteceu...
O Select procurou pelas 10mil primeiras linhas da tabela T. Porém foram encontradas apenas 53.
O "FROM T t1, T t2" faz um cross join, ou seja t1 * t2 (Para cada linha de t1, todas as linhas de t2).
Logo 53*53 == 2.809
E o pulo do gato é que "SELECT NULL" vai substituir cada linha encontrada por NULL. Se fosse select 10, todos os valores seriam 10.
Como temos, na coluna a, a cláusula identity. O sql server não a preenche quando se faz "INSERT SELECT", pois ele vai incrementá-la automaticamente.
Assim o que acontece é: Cria-se 2.809 linhas com valores de 'a' autoincrementados e valores de 'b' = NULL.
Na sequência a coluna 'b' é excluída (alter table X drop column b), restando apenas a coluna 'a' para ser exibida.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo