none
Diferença em query RRS feed

  • 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!
    quinta-feira, 4 de setembro de 2008 19:16

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.

    quinta-feira, 4 de setembro de 2008 20:20

Todas as Respostas

  • Bruno,

     

    Provavelmente porque você esta utilizando o Inner Join e NoLock na primeira query!!!

    quinta-feira, 4 de setembro de 2008 19:33
  • Mas como assim?

    A tabela [Subscription] é de 1 para 1 com com a tabela [User] quando especificado o [Subscription].ProductId,

    então no caso o Inner Join não atrapalharia a minha query, não é?

    e o nolock afeta na consulta?
    quinta-feira, 4 de setembro de 2008 19:37
  • 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)!!!

    quinta-feira, 4 de setembro de 2008 19:52
  • 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,
    quinta-feira, 4 de setembro de 2008 20:15
  • 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.

    quinta-feira, 4 de setembro de 2008 20:20
  • 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.
    quinta-feira, 4 de setembro de 2008 20:27