Considere os clientes de uma loja cadastrados em um SGBDR Microsoft SQL Server, e a necessidade de sortear um cliente para receber um prêmio. O administrador resolve realizar o sorteio através de um código Transact-SQL (TSQL). Dos códigos a seguir, identifique o que irá realizar o sorteio de forma imparcial.
- A)DECLARE @sorteado varchar(35) select top 1 @sorteado = NomeCliente from Cliente; SELECT @sorteado AS 'Cliente sorteado'
Errada: TOP 1 sem ORDER BY pega um registro qualquer da tabela, mas não garante aleatoriedade nem imparcialidade.
- B)DECLARE @sorteado varchar(35) select top NomeCliente @sorteado = NomeCliente from Cliente; SELECT @sorteado AS 'Cliente sorteado'
Errada: a sintaxe está incorreta, pois TOP exige um valor numérico e não faz sentido dessa forma no SQL Server.
- C)DECLARE @sorteado varchar(35) select top 1 @sorteado = NomeCliente from Cliente order by row_number( ); SELECT @sorteado AS 'Cliente sorteado'
Errada: ORDER BY ROW_NUMBER() está mal formulado e não gera sorteio aleatório; além disso, ROW_NUMBER precisa de uma janela válida.
- D)DECLARE @sorteado varchar(35) select top 1 @sorteado = NomeCliente from Cliente order by newid( ); SELECT @sorteado AS 'Cliente sorteado'
Certa: TOP 1 com ORDER BY NEWID() embaralha as linhas e escolhe um cliente ao acaso no SQL Server.
- E)DECLARE @sorteado varchar(35) select top 1 @sorteado = NomeCliente from Cliente group by NomeCliente having count(*) = 1; SELECT @sorteado AS 'Cliente sorteado'
Errada: GROUP BY com HAVING COUNT(*) = 1 filtra clientes únicos, não sorteia ninguém.
Gabarito: D
Quando o enunciado fala em "sorteio imparcial" em SQL Server, a ideia é simples: todas as linhas da tabela precisam ter chance real de aparecer, sem favorecer a primeira, a última ou qualquer ordem já existente. Em T-SQL, isso normalmente é feito embaralhando o resultado antes de pegar um registro com TOP 1. O truque clássico no SQL Server é usar ORDER BY NEWID(). A função NEWID() gera um identificador único diferente para cada linha, e isso cria uma ordenação aleatória no conjunto. Depois, com TOP 1, você pega apenas um cliente dessa lista embaralhada. É uma solução muito usada em provas quando a palavra-chave é aleatoriedade. A alternativa D está correta exatamente por isso: SELECT TOP 1 ... FROM Cliente ORDER BY NEWID() faz o sorteio de forma imparcial, pois randomiza a ordem antes de escolher um único cliente. As demais opções ou não ordenam nada, ou usam sintaxe incorreta, ou tentam filtrar algo que não tem relação com sorteio. Em provas, vale guardar a dupla "TOP 1 + ORDER BY NEWID()" como sinônimo de seleção aleatória no SQL Server. É uma daquelas combinações que a banca adora cobrar como se fosse mágica de banco de dados, mas na prática é só embaralhar e pegar o primeiro.