2011-03-31 3 views
1

가입하면 원래 테이블의 정렬을 변경합니까? 예를가입하면 원래 테이블의 정렬을 변경합니까?

SELECT * FROM #empScheduled 

SELECT es.job_code,es.shift_id, es.unit_id,jd.job_description,s.shift_description,u.unit_code, 
    [group] = (SELECT job_description FROM dbo.job_desc WHERE job_code = jd.job_group_with),es.new_group 
    FROM #empScheduled es JOIN job_desc jd ON es.job_code = jd.job_code 
JOIN dbo.shifts s ON es.shift_id = s.shift_id JOIN dbo.units u 
ON es.unit_id = u.unit_id 

를 들어

같은 기록하지만 서로 다른 선별 수주를 생성합니다! 왜 그런 일이 일어나고 주문을 사용하지 않아도 원래 테이블과 동일한 정렬 순서로 결과를 중단하고 그 결과를 생성하는 방법은 무엇입니까? 감사.

답변

4

ORDER BY를 지정하지 않으면 결과 튜플에 정의 된 순서가 없습니다. SELECT * FROM x은 테이블 스캔 만 수행되기 때문에 간단한 순서로 튜플을 반환합니다. 그러나 조인 또는 유사 작업이 수행되면 중간 결과가 처리되는 방식을 알 수 없으며 결과의 순서가 정의되지 않습니다.

주문의 정의가 아니기 때문에 결과를 "원본 테이블과 동일한 순서로"표시하는 것이 바람직하지 않습니다. 삽입 순서를 유지하려면 오름차순 기본 키를 사용하고 간단히 순서대로 정렬하십시오. 이렇게하면 튜플의 "원래"순서를 항상 복원 할 수 있습니다.

+0

아주 잘 설명했다. 고맙습니다. – Tintin

+0

"간단한 SELECT * FROM x는 테이블 스캔 만 수행되었으므로 저장되어있는 순서대로 튜플을 반환합니다"필요는 없습니다.mytable에서 select *를 선택해도 보증 된 주문이 제공되지 않습니다. – HLGEM

+0

감사합니다. HLGEM ... – Tintin

3

SQL Server에는 고유 한 정렬 순서가 없습니다.

경우에 따라 가입 한 테이블의 색인 및 정렬 된 순서 때문일 수 있습니다.

정렬 된 결과가 일관되게 나타나려면 ORDER BY 절을 사용해야합니다.

+0

많은 감사. "기본 정렬 순서"가없고 테이블 스캔 만 수행 된 경우에도 데이터베이스는 조인 후에도 정확히 동일한 방식으로 수행하지 않습니다. 조인 된 테이블에 인덱스가 없다고 가정하면 원본 테이블과 동일한 정렬 된 순서로 결과가 표시됩니까? – Tintin

+0

@user -'ORDER BY' 절을 사용하지 않으면 출력이 똑같이 정렬된다는 것을 절대로 가정하지 마십시오. 실행 계획처럼 바뀔 수있는 일들과 시간이 지남에 따라 테이블에서 통계가 바뀌면 바뀔 수있는 막후 조인은 무엇이 중요한가에 달려 있습니다. – JNK

+0

알았습니다. JNK에게 감사드립니다. – Tintin

0

FORCE ORDER 힌트를 사용하면 명시 적으로 조인 순서를 적용 할 수 있습니다. 그렇지 않으면 옵티마이 저는 최선이라고 생각하는 방식으로 조인을 정렬 할 수 있습니다. 그래도 ORDER BY을 사용할 수없는 이유는 확실하지 않습니다.

+0

Coul은 사용하지 않습니다. 임시 테이블에 ID 열이 없으므로 주문하십시오. 그럼에도 불구하고 강제 명령을 사용하는 방법을 설명 할 수 있습니까? 감사. – Tintin

+0

FORCE ORDER에 대해 신경 쓰지 마라. 여러 조인을 수행 할 때 옵티 마이저를 조인 순서로 강제 실행하려는 경우입니다. SQL (집합)의 관계가 튜플 (행)에 순서가없는 것으로 정의되었으므로 FORCE ORDER를 호출하더라도 순서가 변경되지 않습니다. 옵티마이 저가 쿼리의 조인 순서에 따라 먼저 특정 테이블에 조인하도록 강요합니다. –

+0

@ user503510이므로 정렬 순서로 사용하려면 임시 테이블에 ID 정의를 추가하십시오. – HLGEM

관련 문제