복붙노트

[SQL] 합니까 UNION ALL 결과 집합의 순서를 보장 [중복]

SQL

합니까 UNION ALL 결과 집합의 순서를 보장 [중복]

나는 확실히 다음 스크립트의 결과 집합은 항상이 O-R-D-E-R과 같이 분류됩니다 될 수 있을까?

SELECT 'O'
UNION ALL
SELECT 'R'
UNION ALL
SELECT 'D'
UNION ALL
SELECT 'E'
UNION ALL
SELECT 'R'

때때로 다른 순서로 입증 할 수 있습니까?

해결법

  1. ==============================

    1.어떤 고유의 순서가 없다, 당신은 ORDER BY를 사용해야합니다. 귀하의 예를 들어, 당신은 쉽게 각 SELECT에 SORTORDER를 추가하여이 작업을 수행 할 수 있습니다. 이것은 다음 원하는 순서대로 기록을 유지합니다 :

    어떤 고유의 순서가 없다, 당신은 ORDER BY를 사용해야합니다. 귀하의 예를 들어, 당신은 쉽게 각 SELECT에 SORTORDER를 추가하여이 작업을 수행 할 수 있습니다. 이것은 다음 원하는 순서대로 기록을 유지합니다 :

    SELECT 'O', 1 SortOrder
    UNION ALL
    SELECT 'R', 2
    UNION ALL
    SELECT 'D', 3
    UNION ALL
    SELECT 'E', 4
    UNION ALL
    SELECT 'R', 5
    ORDER BY SortOrder
    

    특별히 쿼리에 의해 주문을 제공하지 않는 한 당신은 순서를 보장 할 수 없습니다.

  2. ==============================

    2.아니 그렇지 않아. SQL 테이블은 본질적으로 정렬되지 않은 있습니다. 당신은 원하는 순서로 얻을 수있는 것들에 의해 순서를 사용해야합니다.

    아니 그렇지 않아. SQL 테이블은 본질적으로 정렬되지 않은 있습니다. 당신은 원하는 순서로 얻을 수있는 것들에 의해 순서를 사용해야합니다.

    문제는 당신이 그것을 밖으로 시도 할 때 한 번 작동하는지 아니다. 문제는이 동작을 신뢰할 수 있는지 여부입니다. 그리고 당신은 할 수 없습니다. SQL 서버도이에 대한 순서를 보장하지 않습니다 :

    select *
    from (select t.*
          from t
          order by col1
         ) t
    

    그것은 여기에 말한다 :

    SQL 언어의 기본 원칙은 테이블이 정렬되지 않은 것입니다. 쿼리가 여러 데이터베이스에서 작동 할 수 있지만 그래서, 당신은 결과의 순서를 보장하기 위해 BlueFeet에 의해 제안 된 버전을 사용해야합니다.

  3. ==============================

    3.예를 들어, ALLS을 모두 제거하십시오. 심지어 단지 그들 중 하나. 지금이 최적화의 종류가 일어날 것을 고려 (그리고 다른 많은 유형)는 SELECT 쿼리 테이블에 대한 실제 쿼리이며, 개별적으로 최적화하는 경우도 가능합니다. 주문 BY없이, 각 쿼리 내에서 순서는 임의 될 것입니다, 당신은 쿼리 자체가 어떤 순서로 처리되는 것을 보장 할 수 없습니다.

    예를 들어, ALLS을 모두 제거하십시오. 심지어 단지 그들 중 하나. 지금이 최적화의 종류가 일어날 것을 고려 (그리고 다른 많은 유형)는 SELECT 쿼리 테이블에 대한 실제 쿼리이며, 개별적으로 최적화하는 경우도 가능합니다. 주문 BY없이, 각 쿼리 내에서 순서는 임의 될 것입니다, 당신은 쿼리 자체가 어떤 순서로 처리되는 것을 보장 할 수 없습니다.

    어떤 ORDER BY와 UNION ALL을 말하는 것은 말처럼 "그냥 바닥에 모든 구슬을 던져." 어쩌면 당신은 바닥에 모든 구슬을 던질 때마다, 그들은 색상에 의해 조직되고 결국. 즉, 그들은 같은 방식으로 작동합니다 바닥에 던져 다음 시간을 의미하지 않는다. 동일은 SQL Server의 주문도 마찬가지입니다 - 당신이 ORDER BY 다음 SQL Server가 순서 상관 없어 가정 말을하지 않는 경우. 당신은 우연의 일치 항상 반환되는 특정 순서로 볼 수 있지만, 많은 것들이 다음 번에 선택된 임의의 순서에 영향을 줄 수 있습니다. 데이터는 통계 변경, 재 컴파일, 계획 플러시, 업그레이드, 서비스 팩, 핫픽스, 추적 플래그 ... 광고 nauseum을 변경합니다.

    나는 그것을 명확하게하기 위해 큰 글씨로이 둘 것이다 :

    일부 추가 읽기 :

    또한, 코너 커닝햄의 SQL 팀에 꽤 똑똑한 사람에 의해이 게시물을 참조하십시오.

  4. ==============================

    4.아니요 방법 SQL 서버는 당신을 위해 그들을 가져 오는 어떤의 레코드를 얻을. 당신은 thusly 히 1 인덱스에 의한 UNION을 결과 집합에 순서를 적용 할 수 있습니다 :

    아니요 방법 SQL 서버는 당신을 위해 그들을 가져 오는 어떤의 레코드를 얻을. 당신은 thusly 히 1 인덱스에 의한 UNION을 결과 집합에 순서를 적용 할 수 있습니다 :

    SELECT 1, 'O'
    UNION ALL
    SELECT 2, 'R'
    UNION ALL
    SELECT 3, 'D'
    UNION ALL
    SELECT 4, 'E'
    UNION ALL
    SELECT 5, 'R'
    ORDER BY 1
    
  5. from https://stackoverflow.com/questions/15766359/does-union-all-guarantee-the-order-of-the-result-set by cc-by-sa and MIT license