2013-03-14 5 views
2

내가 노동 조합은 중복 제거 알고하지 않습니다하지만 중복 TSQL은, 노동 조합 변경 순서를 결과, 노동 조합은 모든

내가 문 어디서나

에 의해 두 개의 선택 문, 아니 순서가없는 경우에도이 결과 순서가 변경됩니다 나는 또는

실제로 아무것도 포함하지 않는다 "B 선택"어떤 항목이

반환되지 않습니다

즉 은 "(모두) 선택 B를 노동 조합을 선택"(모두)없이 노동 조합을 원하는

나는, 결과의 순서는 단지 다른 "A 조합을 선택 B 선택"을 사용하는 경우 "를 선택 A"

내가 사용하는 결과의 순서와 동일 "B 모두 선택 노조 선택"경우 "Select A"그 자체

그리고 "Select A"에는 중복이 없습니다.

왜 이럴까요?

답변

6

SQL 쿼리 결과의 특정 순서를 얻을 수있는 방법은 ORDER BY 절을 사용하는 것입니다 예측할 수있다. 다른 것은 쿼리를 발행 할 때 서버의 우연과 특정 (일시적인) 상태에 의존하는 것입니다.

따라서 특정 주문을 원하거나 필요로하는 경우 ORDER BY을 사용하십시오.


로 결과의 순서를 변경하는 이유에 - 다만 다른 쿼리에서 발생하는 복제합니다 - - 첫째, (ALL없이) UNION은 결과에서 모든 중복을 제거하기 위해 보장 그래서 첫 번째 쿼리가 반환하는 경우 두 번째 쿼리는 행을 반환하지 않으므로 UNION은 여전히이를 제거해야합니다.

결과의 모음에 중복이 있는지 여부를 확인하는 가장 쉬운 방법 중 하나는 결과를 정렬하는 것입니다 (시스템에 가장 편리한 정렬 순서로). 이렇게하면 복제본이 서로 가깝게 끝나고 따라서 이러한 정렬 된 결과와 if(results[index] == results[index-1]) skip;을 반복 할 수 있습니다.

따라서 UNION (ALL 제외) 검색어의 결과가 임의의 순서로 정렬되어있는 경우가 많습니다. 그러나 원래의 요점을 다시 강조하기 위해 적용된 순서는 정의되어 있지 않으며 신뢰할 수 없습니다. 소프트웨어에 대한 패치, 인덱스 또는 통계의 변경으로 인해 시스템에서 다른 정렬 순서를 선택할 수 있습니다 ORDER BY 절이 없으면 쿼리가 실행되는 시간입니다.

+0

감사합니다. 거기에 주문을 넣어 주셔야하므로 –

3

SQL에 대해 이해해야 할 가장 중요한 점 중 하나는 테이블이 집합 (또는 중복이있는 경우 다중 집합)을 나타 내기 때문에 순서가 보장되지 않으며 집합에 순서가 없음을 의미합니다. 즉, ORDER BY 절을 지정하지 않고 테이블을 쿼리하면 쿼리 결과가 테이블 결과를 반환하고 SQL Server는 자유롭게 임의의 순서로 출력의 행을 반환 할 수 있습니다.. 결과가 주문 된 경우 최적화 이유가 원인 일 수 있습니다. 내가하고자하는 요점은 출력에서 ​​행의 모든 ​​순서가 유효한 것으로 간주되며 특정 순서가 보장되지 않는다는 것입니다. 결과의 행이 정렬되도록 보장하는 유일한 방법은 명시 적으로 ORDER BY 절을 지정하는 것입니다.

+0

부탁드립니다. 나는 거기서 명령을 내려야 해. –

관련 문제