문제

몇 가지 노조 진술이 고안된 예로 있다면 다음과 같습니다.

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

기본값은 무엇입니까? order by 행동?

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

또 다른 것은이 경우 xxx가보기라는 것입니다. View는 3 개의 다른 테이블을 결합하여 원하는 결과를 반환합니다.

도움이 되었습니까?

해결책

기본 주문이 없습니다.

없이 주문 반환 된 명령이 정의되지 않았습니다. 즉, SQL Server가 좋아하는 순서로 다시 가져올 수 있습니다.

편집 : 내가 본 것들에 따라 주문없이 결과가 다시 나오는 순서는 쿼리 계획에 따라 다릅니다. 따라서 사용중인 인덱스가 있으면 결과가 해당 순서로 돌아올 수 있지만 다시 보장은 없습니다.

다른 팁

절에 의해 주문 추가와 관련하여 :

이것은 아마도 대부분의 기본이지만 나는 이것을 추가했다고 생각했다. 때로는 결과가 혼합되기를 원하지 않으므로 첫 번째 쿼리 결과와 두 번째 쿼리 결과를 원합니다. 그렇게하기 위해 더미 첫 열을 추가하고 주문합니다. 노조의 열을 별칭으로 잊어 버릴 수있는 문제로 인해, 나는 일반적으로 열 이름이 아닌 절 순서에 따라 조례를 사용합니다.

예를 들어:

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

더미 서수는 두 개의 쿼리를 실행할 시간에도 유용하며 한 명만 결과를 반환 할 것임을 알고 있습니다. 그런 다음 반환 된 결과의 서수를 확인할 수 있습니다. 이로 인해 여러 데이터베이스 호출과 가장 빈 resultSet 확인을 수행하지 않아도됩니다.

방금 실제 답변을 찾았습니다.

Union은 복제를 제거하기 때문에 뚜렷한 종류를 수행합니다. 이것은 모든 노조 진술이 연결되기 전에 이루어집니다 (실행 계획을 확인하십시오).

종류를 중지하려면 모든 것을 모두 수행하면 복제물도 제거되지 않습니다.

레코드가 반환되는 주문에 관심이 있으시면 주문을 사용해야합니다.

당신이 그것을 남겨두면, 그것은 할 수 있습니다 나타나다 정리 된 (쿼리 플랜에서 선택한 색인을 기준으로), 오늘날 당신이 볼 수있는 결과는 당신이 기대하는 결과가 아니며 내일 동일한 쿼리가 실행될 때도 변경 될 수 있습니다.

편집 : 몇 가지 좋은 특정 예 : (모든 예제는 MS SQL Server입니다)

  • Dave Pinal의 블로그 다른 인덱스가 사용되기 때문에 두 가지 매우 유사한 쿼리가 다른 명백한 순서를 어떻게 표시 할 수 있는지 설명합니다.

    SELECT ContactID FROM Person.Contact
    SELECT *         FROM Person.Contact
    
  • Conor Cunningham 테이블이 커질 때 명백한 순서가 어떻게 변경 될 수 있는지를 보여줍니다 (쿼리 옵티마이저가 병렬 실행 계획을 사용하기로 결정한 경우).

  • 휴고 코르 넬리 스 명백한 순서가임을 증명합니다 ~ 아니다 항상 기본 키를 기반으로합니다. 그의 후속 게시물은 다음과 같습니다 설명과 함께.

데이터베이스는 때때로 데이터베이스가 노조에 암시적인 뚜렷한 것을 제공하기 위해 분류 방법을 사용하기 때문에 결과 세트 순서와 관련하여 기만적 일 수 있습니다. 물론 암시 적 구별은 없습니다.

그러나 10g+의 Oracle 's Hash 메소드와 같은 암시 적 별개의 알고리즘이 있으며, 이는 순서가 적용되지 않습니다.

DJ가 말했듯이 항상 주문을 사용하십시오

테이블 데이터가 삽입 순서로 반환된다고 가정하는 잘못 쓰여진 코드를 발견하는 것이 매우 일반적이며, 코더가이를 벗어나는 시간의 95%가 많은 일반적인 데이터베이스 (MSSQL, Oracle, MSSQL, Oracle,)와 같이 문제 가라는 것을 결코 알지 못합니다. mysql). 물론 완전한 오류이며해야합니다 언제나 만날 때 수정하고 항상 예외없이 직접 주문을 사용하십시오.

내 실제 경험에서 "Union All"에 대해 "Union"을 사용하여 주문을 변경할 수 있습니다 ... 즉, 쿼리가 같은 경우

Select Count(*) from Table A
UNION 
Select Count(*) from Table B

result is
10
26

"Union"을 "Union All"로 대체하여 주문을 뒤집을 수 있습니다.

26
10
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top