Observe o script a seguir, no âmbito do MS SQL Server.create...

Próximas questões
Com base no mesmo assunto
Q873275 Banco de Dados
Observe o script a seguir, no âmbito do MS SQL Server.
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:
Alternativas

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