2009-07-10 2 views
3

대답은 아니요이라고 생각합니다. 그리고 카운터 예을 찾고 order by 절이 없으면 출력 순서가 보장되지 않음을 보여줍니다.row_number()를 사용할 때 출력 순서에 따라 달라질 수 있습니까

고려 :

  1. customerId에 대한 행되는 출력 연속 : MS SQL 서버 2005

    create table #order (orderId int primary key clustered 
        , customerId int not null -- references customer(customerId) 
        , orderDateTIme datetime not null) 
    
    insert into #order values (1, 100, '2009-01-01') 
    insert into #order values (2, 101, '2009-01-02') 
    insert into #order values (3, 102, '2009-01-03') 
    insert into #order values (4, 103, '2009-01-04') 
    insert into #order values (5, 100, '2009-01-05') 
    insert into #order values (6, 101, '2009-01-06') 
    insert into #order values (7, 101, '2009-01-07') 
    insert into #order values (8, 103, '2009-01-08') 
    insert into #order values (9, 105, '2009-01-09') 
    insert into #order values (10, 100, '2009-01-10') 
    insert into #order values (11, 101, '2009-01-11') 
    insert into #order values (12, 102, '2009-01-12') 
    insert into #order values (13, 103, '2009-01-13') 
    insert into #order values (14, 100, '2009-01-14') 
    insert into #order values (15, 100, '2009-01-15') 
    insert into #order values (16, 101, '2009-01-16') 
    insert into #order values (17, 102, '2009-01-17') 
    insert into #order values (18, 101, '2009-01-18') 
    insert into #order values (19, 100, '2009-01-19') 
    insert into #order values (20, 101, '2009-01-20') 
    
    select * from #order 
    -- Results in PK order due to clustered primary key 
    
    select orderId, CustomerId, orderDateTime 
        , row_number() over (partition by customerId order by orderDateTime) RN 
    from #order 
    

    는, 출력 순서는 두 가지 속성이 있습니다.

  2. Row_number()은 각각 고객 번호 내에서 순차적입니다.

명백히 order by 절이 없으면이 두 속성이 보장되지 않습니다. 위의 속성이 order by 절에 의해 강제되지 않는 예제를 찾고 있는데, MS SQL Server가 어떻게 작동하는지에 대한 결과입니다. 필요한 경우 자신의 예제에서 자체 테이블 정의, 색인 등을 자유롭게 개발할 수 있습니다.

내가 잘못하면 명시 적 order by 절이 없어도 이러한 순서가 보장된다는 참조에 대한 링크가 보장됩니다.

+2

+1을 작성하여 스크립트를 작성하면 모두가 그랬 으면 좋겠어! –

답변

10

주문한 결과 집합을 원할 경우 에 ORDER BY 절을 추가합니다. 기간. 다른 것은 상황에 따라 다르며 현재 테스트중인 SQL 빌드, 최적화 프로그램의 하루 분위기 및 물고기 자리의 화성 이동 단계에 따라 작동하지 않을 수도 있습니다.

당신의 가정을 모순 예제이다 :

select orderId, CustomerId, orderDateTime 
    , row_number() over (partition by customerId order by orderDateTime) RN 
    , row_number() over (partition by orderDateTime order by customerId) AntiRN 
from #order 
+1

필자의 가정은 "이 두 속성은 명시적인 order by 절이 없어도 보장되지 않습니다."그래서 당신은 내 가정을 모순되지 않지만 내가 찾고있는 예제를 제공했습니다. –

+2

+1 좋은 예! –

2

여기에서 관련성을 찾는 데 어려움을 겪고있는 임; 명시 적으로 순서를 지정하려면 쿼리에서 ORDER BY 절을 사용하는 것이 좋습니다.

나는 이 아닙니다.은 결과 순서에 의존하는 쿼리를 생성 할 때 테이블의 기본 순서에 의존합니다. 현대의 RDBMS는 인덱스 등을 기반으로 주문을 최적화 할 수 있으므로 걱정해야 할 것이 아닙니다. 이 BY 절에는 ORDER가 존재하지 않는 경우, 출력은 ROW_NUMBER 값으로 정렬되는 부작용이있는 동안이 보장되지 않는 안부에서

, 당신 는,이 동작에 의존하지 수, ROW_NUMBER합니다.

또한 출력 순서를 보장하는 방법은 ORDER BY 절을 사용하는 것입니다.

+0

Relevance는 order by 절에서 row_number()를 호출하는 대신 ordering을 수행하는 다른 프로그래머와 작업 할 때 counter 예제를 준비하고 싶습니다. –

0

당신이 주문하려는 경우, ORDER BY를 사용해야합니다. 더 "에 의해 순서가"존재하지 않는 경우

그냥

SET SHOWPLAN_ALL ON 

와 실행 계획을 보는 StmtText 열에서 방금 모든 작업이 완료된 후 그러나 그들은 분류되어 일을 얻는다.때로는 데이터가 저장 /로드/필터링/결합되는 방식 및 반환 방법과 함께 때때로 운이 좋을 수도 있습니다.

1

위에서 언급 한 것처럼 ORDER BY 없이는 행 순서에 의존 할 수 없습니다.

그러나 ROW_NUMBER() 함수 에 의존 할 수 있습니다. 당신이 DemoRank하여 클라이언트에서 데이터를 사용할 경우 레코드 순서 (순서 지수)에 의존하는 경우

SELECT 
    principal_id, name, 
    ROW_NUMBER() OVER (ORDER BY principal_id DESC) AS DemoRank 
FROM 
    msdb.sys.database_principals 
ORDER BY 
    name 

는, 당신없이 다음 절

에 의해 심지어 ORDER없이 확인을 할 것이다.

위 예에서는 '##MS_PolicyEventProcessingLogin##'로서 첫 번째 행 (인덱스 = 0)를 제공하지만 DemoRank 값을 이용하여 "db_denydatawriter"

BY 기본적 사용 ORDER을 준다.

관련 문제