2009-09-24 2 views
1

나는에 DISITINCT를 사용하는 경우() 함수를 ROW_NUMBER를 사용하여 내림차순으로 결과를 주문할 때 가장 바깥 쪽 아래 내 쿼리에서 선택한 보이는 이상한 행동을 이해하기 위해 노력하고있어 :SQL 서버 2005 - ROW_NUMBER()

SELECT DISTINCT (ID), State_Id, Name_Of_Trip, Date_Of_Travel, Creation_Date, Locking_Id, Applicant_Name, Reference_Number, State_Name 
    FROM (

    SELECT app.ID, app.State_Id, app.Name_Of_Trip, app.Date_Of_Travel, app.Creation_Date, app.Locking_Id, app.Applicant_Name, app.Reference_Number, 
    State.Name AS State_Name, ROW_NUMBER() OVER(ORDER BY Reference_Number DESC) as rowNum 
    FROM Application_Leg AS app 
    INNER JOIN State AS state 
    ON app.State_Id = state.ID 
    WHERE (app.State_Id = 5 OR app.State_Id = 6 OR app.State_Id = 8) AND app.Organisation_Id=12 
    AND Leg_Number IN 
    (SELECT DISTINCT Leg_Number 
    from Application_Leg as al 
    INNER JOIN 
    Organisation as org 
    ON al.Organisation_Id = org.ID 
    WHERE al.ID=app.ID AND org.Approval_Required=1 AND Mode_Of_Transport=1)) 
    as pagedApplications 
    WHERE rowNum BETWEEN 0 AND (0 + 10) 

가장 바깥 쪽 DISTINCT를 꺼낼 때 내림차순이 좋지만 포함될 때 결과는 내림차순으로 표시되지 않습니다.

답변

0

외부 선택으로 주문을 추가 했습니까?

9

ORDER BYROW_NUMBER 절은 결과 집합의 순서를 보장하지 않습니다.

ROW_NUMBER은 대개 쿼리 계획에서 정렬을 사용하므로 결과 값이 사전 정렬됩니다.

이것은 부작용이며 신뢰할 수 없습니다.

DISTINCT은 정렬을 중단하는 Hash Match (Aggregate)을 사용합니다.

쿼리의 끝에 ORDER BY 절을 추가
SELECT DISTINCT (ID), State_Id, Name_Of_Trip, Date_Of_Travel, Creation_Date, Locking_Id, Applicant_Name, Reference_Number, State_Name 
FROM (
     SELECT app.ID, app.State_Id, app.Name_Of_Trip, app.Date_Of_Travel, 
       app.Creation_Date, app.Locking_Id, app.Applicant_Name, app.Reference_Number, 
       State.Name AS State_Name, ROW_NUMBER() OVER(ORDER BY Reference_Number DESC) as rowNum 
     FROM Application_Leg AS app 
     INNER JOIN 
       State AS state 
     ON  app.State_Id = state.ID 
     WHERE app.State_Id IN (5, 6, 8) 
       AND app.Organisation_Id = 12 
       AND Leg_Number IN 
       (
       SELECT Leg_Number 
       FROM Application_Leg as al 
       INNER JOIN 
         Organisation as org 
       ON  al.Organisation_Id = org.ID 
       WHERE al.ID = app.ID 
         AND org.Approval_Required = 1 
         AND Mode_Of_Transport = 1 
       ) 
     ) AS pagedApplications 
WHERE rowNum BETWEEN 0 AND (0 + 10) 
ORDER BY 
     ReferenceNumber DESC 

는 또한 최초의 10 결과 DISTINCT 반환합니다, 그것은 10 서로 다른 결과를 반환하지 않습니다. 당신이 이전을 원하는 경우에

, 이것을 사용 : 매우 흥미로운

SELECT DISTINCT TOP 10 ID, State_Id, Name_Of_Trip, Date_Of_Travel, Creation_Date, Locking_Id, Applicant_Name, Reference_Number, State_Name 
FROM (
     SELECT app.ID, app.State_Id, app.Name_Of_Trip, app.Date_Of_Travel, 
       app.Creation_Date, app.Locking_Id, app.Applicant_Name, app.Reference_Number, 
       State.Name AS State_Name 
     FROM Application_Leg AS app 
     INNER JOIN 
       State AS state 
     ON  app.State_Id = state.ID 
     WHERE app.State_Id IN (5, 6, 8) 
       AND app.Organisation_Id = 12 
       AND EXISTS 
       (
       SELECT Leg_Number 
       FROM Application_Leg AS al 
       INNER JOIN 
         Organisation as org 
       ON  al.Organisation_Id = org.ID 
       WHERE al.ID = app.ID 
         AND al.LegNumber = app.LegNumber 
         AND org.Approval_Required = 1 
         AND Mode_Of_Transport = 1 
       ) 
     ) AS pagedApplications 
ORDER BY 
     ReferenceNumber DESC 
+0

합니다. – David