복붙노트

[SQL] SQL 서버 UNION - 행동 BY 기본 ORDER 무엇

SQL

SQL 서버 UNION - 행동 BY 기본 ORDER 무엇

나는 인위적인 예로서 몇 UNION 문이있는 경우 :

SELECT * FROM xxx WHERE z = 1
UNION 
SELECT * FROM xxx WHERE z = 2
UNION
SELECT * FROM xxx WHERE z = 3

행동하여 기본 순서는 무엇입니까?

나는 기본적으로보고 있어요 테스트 데이터는 위에 지정된 순서대로 데이터를 반환하지 않습니다. 즉 데이터는 주문하지만, 나는이에 대한 우선 순위의 규칙이 무엇인지 알고 싶어한다.

또 다른 것은이 경우 XXX에서보기 것입니다. 뷰는 내가 원하는 결과를 반환하기 위해 함께 3 개 개의 테이블을 조인.

해결법

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

    1.디폴트 순서는 없습니다.

    디폴트 순서는 없습니다.

    주문 절없이 반환되는 순서는 정의되지 않는다. 즉, SQL 서버는 다시이 좋아하는 임의의 순서를 가져올 수 있습니다.

    편집하다: 내가 본 것을 바탕으로, 주문하지 않고, 결과가 다시 올 순서는 쿼리 계획에 따라 달라집니다. 이 사용하고있는 인덱스가있는 경우 그래서, 결과는 순서대로 돌아올 수 있지만 다시 보장은 없습니다.

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

    2.ORDER BY 절을 추가에 관해서 :

    ORDER BY 절을 추가에 관해서 :

    이 여기에 대부분 아마 초등학교입니다하지만 난이 추가 생각했다. 때때로 당신은 결과가 당신이 다음 두 번째를 첫 번째 쿼리의 결과를 할 수 있도록, 혼합 등 싶지 않아요. 난 그냥 그하여 더미 첫 번째 열 순서를 추가 할 수 있습니다. 때문에 노동 조합의 별명에 열을 잊고와 가능한 문제, 나는 보통, ORDER BY 절에서 열 이름이 아닌를 서수를 사용합니다.

    예를 들면 :

    SELECT 1, * FROM xxx WHERE z = 'abc'
    UNION ALL
    SELECT 2, * FROM xxx WHERE z = 'def'
    UNION ALL
    SELECT 3, * FROM xxx WHERE z = 'ghi'
    ORDER BY 1
    

    나는 두 개의 쿼리를 실행하는거야 내가 단 하나의 결과를 반환하는 것입니다 알고 더미 순서 열은 시간에 유용합니다. 그럼 난 그냥 반환 된 결과의 순서를 확인할 수 있습니다. 이것은 여러 데이터베이스 호출 대부분 빈 결과 집합 검사를 할 필요에서 저를 저장합니다.

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

    3.그냥 실제 답을 발견했다.

    그냥 실제 답을 발견했다.

    UNION 중복을 제거하기 때문에 그것은 DISTINCT SORT 않습니다. 모든 UNION 문이 연결됩니다 전에이 (실행 계획을 확인) 이루어집니다.

    일종의을 중지하려면 UNION ALL을하고이 또한 중복 제거되지 않습니다.

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

    4.레코드가 반환되는 순서를 당신이 걱정하는 경우에 의해 주문을 사용해야합니다.

    레코드가 반환되는 순서를 당신이 걱정하는 경우에 의해 주문을 사용해야합니다.

    당신이 그것을 떠날 경우 (쿼리 계획에 의해 선택된 인덱스 기준) 조직 나타날 수 있지만, 결과는 오늘 당신이 기대하는 결과가되지 않을 수 있습니다보고, 동일한 쿼리 내일 실행될 때조차 변경 될 수 있습니다.

    편집 : 좋은, 특정 예 : (모든 예제는 MS SQL 서버입니다)

  5. ==============================

    5.데이터베이스가 때로는 의도적으로 정렬 행처럼 보이게하는 UNION에서 암시하고있는 DISTINCT를 제공하기 위해 정렬 방법을 사용하기 때문에 노동 조합이 세트 주문 결과와 관련하여 현혹 될 수 있습니다 -이 UNION ALL 적용되지 않습니다 하는 물론, 별개의 암시도 없다.

    데이터베이스가 때로는 의도적으로 정렬 행처럼 보이게하는 UNION에서 암시하고있는 DISTINCT를 제공하기 위해 정렬 방법을 사용하기 때문에 노동 조합이 세트 주문 결과와 관련하여 현혹 될 수 있습니다 -이 UNION ALL 적용되지 않습니다 하는 물론, 별개의 암시도 없다.

    그러나 같은 어떤 순서가 적용되지 않습니다되는 10g + 오라클의 해시 방법으로 별개의 암시에 대한 알고리즘이있다.

    DJ가 말한대로, 항상 의해 주문을 사용

  6. ==============================

    6.그것은 삽입 순서로 반환되는 테이블 데이터를 가정 잘못 작성된 코드를 건너 매우 일반적인, 그리고 코더가 멀리 얻고이 많은 일반적인 데이터베이스에 같은 문제 (MSSQL, 오라클은 알고 결코 시간의 95 %, MySQL의). 그 건너, 그리고 항상 예외없이 절 스스로 주문을 사용할 때 그것은 물론 완전한 착오이며 항상 수정해야합니다.

    그것은 삽입 순서로 반환되는 테이블 데이터를 가정 잘못 작성된 코드를 건너 매우 일반적인, 그리고 코더가 멀리 얻고이 많은 일반적인 데이터베이스에 같은 문제 (MSSQL, 오라클은 알고 결코 시간의 95 %, MySQL의). 그 건너, 그리고 항상 예외없이 절 스스로 주문을 사용할 때 그것은 물론 완전한 착오이며 항상 수정해야합니다.

  7. from https://stackoverflow.com/questions/421049/sql-server-union-what-is-the-default-order-by-behaviour by cc-by-sa and MIT license