2013-01-17 1 views
2

유니온의 두 부분의 순서가 특정 순서로 주어 지도록 보장됩니까? 나는. 이 쿼리의 결과는 :노조의 순서는 모두 보장됩니까?

select 'foo' from dual 
union all 
select 'bar' from dual 

항상

foo 
bar 

아니라이

bar 
foo 

수 있습니까?

필자는 Oracle 구문을 사용했지만 ISO 표준에서 이에 대해 언급 한 내용을 알고 싶습니다.

+2

"SQL 세계에서 주문은 데이터 집합의 본질적인 속성이 아니므로 데이터가 특정 순서로 또는 심지어 일관된 순서로 되돌아 올 것이라고 보장 할 수 없습니다. ORDER BY 절을 사용하여 데이터를 쿼리하지 않는 한. " – showdev

+0

주문이 보장되는지 여부는 모르겠지만 다른 쿼리로이 쿼리를 묶은 다음 수동으로 결과를 정렬 할 수 있습니다. SELECT * FROM (선택 'foo', col_1 ... UNION). ..) ORDER BY col_1'. 적어도 그러한 쿼리는 장황하고 명확합니다. – Crozin

답변

3

특정 예에서 DUAL 테이블에 대해 쿼리하고 있기 때문에 순서가 변경되어서는 안되며 특정 쿼리의 잠재적 인 인덱스 변경에 대해 걱정할 필요가 없습니다. 그래서 당신은 언제나 Foo와 Bar를 각각 얻을 것입니다.

그러나 실세계에서는 주문이 가장 확실하게 바뀔 수 있습니다. 테이블 색인, 반환되는 열, 새 데이터가 도입되는 등 여러 요인에 따라 달라질 수 있습니다. 결과가 특히, ORDER BY 절을 지정해야합니다.

희망이 도움이됩니다. 쿼리의

1

하기 권장 재 작성 :

SELECT txt FROM (
select 1 as sort, 'foo' as txt from dual 
union all 
select 2 as sort, 'bar' as txt from dual 
) product 
ORDER BY sort 
+0

감사합니다. 이것은 매우 간단합니다. 나는 그러한 재 작성이 전혀 필요하지 않은지 궁금해하고 있었다. –

+0

다른 사람들이 말했듯이, 아마 괜찮을 지 모르지만, 지정하지 않으면 보장되지 않습니다. – invertedSpear

1

ISO 표준 테이블은 본질적으로 정렬되지 않은 것을 말한다. 또한 쿼리에서 행을 반환 할 때 order by 절을 사용하지 않는 한 주문의 보증을 의미합니다.

연습에서 대부분의 데이터베이스는이 경우 막대 앞에 foo를 반환합니다. 그러나 union allunion으로 변경하면 일부 데이터베이스가 먼저 막대를 반환합니다.

더 나쁜 것은 첫 번째 쿼리의 모든 행이 두 번째 전에 반환된다고 말할 수조차 없다는 것입니다. 예를 들어, 병렬 환경에서는 공용체의 결과 세트가 두 테이블 모두를 사용하여 행을 혼합 할 수 있습니다.

먼저 foo를 원하면 order by txt desc 또는 그 효과를 추가하십시오.

관련 문제