Usuário com melhor resposta
Diferença em query

Pergunta
-
Galera,
As duas querys abaixo deveriam me trazer o mesmo resultado, mas elas trazem alguns registros diferentes...
alguem sabe o porquê?
Select Top (5) [Subscription].*,
From [Subscription] With (NOLOCK)
Inner Join [User] With (NOLOCK) On [User].UserId = [Subscription].UserId
Where [Subscription].ProductId = 'gostei'
Order by [Subscription].CreationDate Desc
Go
select * from [Subscription] where productId = 'gostei' order by creationDate desc
GO
Os 5 primeiros resultados deveriam ser iguais, mas não são! aparecem alguns registros quais as datas não são as maiores na primeira query.
não consigo entender o porque...
Desde já obrigado!
Respostas
-
Bruno,
Eu utilizo normalmente o TOP com Order By sem problemas.
Quando utilizamos o TOP o SQL Server, vai primeira realizar um busca e selecionar a quantidade de registros desejados e depois vai fazer a ordenação de acordo com os dados selecionados, logicamente respeitando uma seqüência de ordenação de acordo com o campo ou campos declarados no Order By.
Todas as Respostas
-
-
-
Bruno,
Pode ser que o Inner Join esteja forçando a execução da query criando um produto cartesiano!!
No caso do nolock a função deste hint lock é evitar que as tables utilizadas no Select possam ser afetar ou ser afetados por algum tipo de bloqueio(lock)!!!
-
hmm, entendi...
Eu vou pesquisar sobre esse producto cartesiano.
Eu ouvi dizer que Top N junto com Order by dá problema, é verdade?
Por exemplo... ao utilizar os dois juntos, em vez do SQL Server ordenar a tabela inteira e depois recuperar os top N, ele primeiro seleciona os top N e depois dá um order by, fazendo com que vários registros não façam parte da ordenação (como no caso é o que eu estou querendo, que são os registros que tem as 5 maiores datas na tabela)
Muito obrigado, -
Bruno,
Eu utilizo normalmente o TOP com Order By sem problemas.
Quando utilizamos o TOP o SQL Server, vai primeira realizar um busca e selecionar a quantidade de registros desejados e depois vai fazer a ordenação de acordo com os dados selecionados, logicamente respeitando uma seqüência de ordenação de acordo com o campo ou campos declarados no Order By.
-
Entendi.
aliás eu montei uma query que deve resolver meus problemas agora:
SELECT *
FROM [User]
WITH (NOLOCK)
WHERE [User].UserId IN
(
SELECT TOP 5 UserId
FROM [Subscription] WITH (NOLOCK)
WHERE ProductId = @ProductId
ORDER BY CreationDate DESC
)
Eu necessito recuperar os 5 últimos usuários cadastrados na tabela.
Muito obrigado pela ajuda.