Questão nº 40
Questão de Banco de Dados · FGV CGE-SC 2022 (nº 40)
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'
``` - B```
DECLARE @sorteado varchar(35)
select top NomeCliente @sorteado = NomeCliente
from Cliente;
SELECT @sorteado AS 'Cliente sorteado'
``` - C```
DECLARE @sorteado varchar(35)
select top 1 @sorteado = NomeCliente
from Cliente order by row_number();
SELECT @sorteado AS 'Cliente sorteado'
``` - D```
DECLARE @sorteado varchar(35)
select top 1 @sorteado = NomeCliente
from Cliente order by newid();
SELECT @sorteado AS 'Cliente sorteado'
``` (alternativa correta) - E```
DECLARE @sorteado varchar(35)
select top 1 @sorteado = NomeCliente
from Cliente group by NomeCliente
having count(*) = 1;
SELECT @sorteado AS 'Cliente sorteado'
```
Resposta comentada
Gabarito Alternativa D
Para sortear um item de forma imparcial em SQL Server, é preciso que cada item tenha a mesma chance de ser escolhido, o que se consegue embaralhando a ordem dos registros antes de selecionar o primeiro.
- (A) Incorreta: Selecionar
TOP 1sem uma cláusulaORDER BYnão garante imparcialidade, pois a ordem dos registros não é aleatória e pode depender da estrutura física da tabela ou de índices. - (B) Incorreta: A sintaxe
select top NomeClienteestá incorreta; a cláusulaTOPespera um número ou percentual, não um nome de coluna. - (C) Incorreta:
ORDER BY row_number()não garante uma ordem aleatória.ROW_NUMBER()atribui números sequenciais e, sem umORDER BYdentro de sua cláusulaOVER(), a ordem pode ser arbitrária, mas não aleatória para fins de sorteio. - (D) Correta: A função
NEWID()gera um identificador único global (GUID) para cada linha. Ao usarORDER BY NEWID(), as linhas são ordenadas de forma aleatória a cada execução, garantindo queTOP 1selecione um cliente de forma imparcial. - (E) Incorreta: Esta alternativa filtra clientes que possuem nomes únicos (
having count(*) = 1) e depois seleciona oTOP 1sem qualquer critério de aleatoriedade, não realizando um sorteio imparcial.
Fonte: FGV CGE-SC 2022 Auditor do Estado - Ciências da Computação (Caderno Tipo 1). Reproduzida para fins de estudo.