2014-06-24 3 views
0

내 쿼리가 예상보다 다른 순서로 항목을 반환하는 이유를 이해하려고합니다. 내 질문은 : 나는 autoid 다음, 상단에 printjobid와 함께, 그것은 나에게 3 개 행을 줄 것으로 기대하고있다오라클 유니온이 잘못된 순서로 표시됩니다.

SELECT 'PRINTJOBID', MAX(PRINTJOBID), null, null FROM PRINTJOB 
UNION 
SELECT 'AUTOID', null, MAX(AUTOID), null FROM PRINTJOBSHELLS 
UNION 
SELECT 'PROCESSLOGID', null, null, MAX(PROCESSLOGID) FROM PROCESSLOG; 

하고 하단에 processlogid해야합니다. 내가 쿼리를 실행할 때, 나는 다음과 같이 하단에있는 중간에 printjobid 상단에 autoid, 및 processlog을 얻을 :

AUTOID 널 771426 널
PRINTJOBID 76401 NULL, NULL
PROCESSLOGID 널 널 1,218,693

잘못된 순서로 된 유니온에 대한 인터넷 검색을 시도 했으므로 나는 그 질문에 대한 검색을 시도했습니다. 나는 관련있는 것으로 보이는 것을 보지 못했습니다. UNION이 어떻게 작동하는지 이해하고 있습니까? 쿼리가 select 문을 넣은 순서로 행을 반환한다고 생각했습니다. 고맙습니다!

+0

- 아니, 전혀. 결과 순서는 지정하지 않으면 지정되지 않습니다. 똑같은 데이터 세트를 정확히 두 번 연속 실행하면 데이터베이스 엔진이 쿼리를 병렬로 실행하기로 결정하고 CPU 중 하나가 다른 작업으로 인해 바쁠 경우와 같이 다른 순서로 레코드를 반환 할 수 있습니다. 성명서 끝에 ORDER BY가 없으면 어떤 명령을 의지 할 수 없습니다. – Quassnoi

+0

나는 그것을 지워 줘서 고맙다. ORDER BY를 자주 사용해야 할 것입니다. – carrizal

답변

1

SQL에서는 쿼리에 명시 적으로 지정하지 않으면 특별한 순서로 결과를 반환하는 쿼리에 의존 할 수 없습니다.

사용이 : 내가 쿼리 내가 선택 문 * 넣어 순서대로 행을 반환 것이라고 생각 *

SELECT title, v1, v2, v3 
FROM (
     SELECT 'PRINTJOBID' title, MAX(PRINTJOBID) v1, null v2, null v3, 1 AS o 
     FROM PRINTJOB 
     UNION ALL 
     SELECT 'AUTOID' title, null, MAX(AUTOID), null, 2 AS o 
     FROM PRINTJOBSHELLS 
     UNION ALL 
     SELECT 'PROCESSLOGID' title, null, null, MAX(PROCESSLOGID), 3 AS o 
     FROM PROCESSLOG 
     ) 
ORDER BY 
     o 
0

결과의 순서를 지정하려면 ORDER BY 절을 지정해야합니다. 그렇지 않으면 구현 관련 동작에 의존합니다. 이 경우에는 원래 의도했던 순서를 얻지 못했기 때문에 운이 좋을 것입니다. 나중에 행동이 쉽게 바뀔 수 있으므로 중요 할 경우 명시 적으로 순서를 지정해야합니다.

+0

오, 기본적으로 첫 번째 열에 알파벳순으로 정렬하는 것처럼 보입니다. 결과를 주문하지 말고, 당신이 가지고있는 순서대로 노동 조합을 나에게 줄 수있는 방법이 있습니까? – carrizal

관련 문제