유니온의 두 부분의 순서가 특정 순서로 주어 지도록 보장됩니까? 나는. 이 쿼리의 결과는 :노조의 순서는 모두 보장됩니까?
는select 'foo' from dual
union all
select 'bar' from dual
항상
foo
bar
아니라이
bar
foo
수 있습니까?
필자는 Oracle 구문을 사용했지만 ISO 표준에서 이에 대해 언급 한 내용을 알고 싶습니다.
유니온의 두 부분의 순서가 특정 순서로 주어 지도록 보장됩니까? 나는. 이 쿼리의 결과는 :노조의 순서는 모두 보장됩니까?
는select 'foo' from dual
union all
select 'bar' from dual
항상
foo
bar
아니라이
bar
foo
수 있습니까?
필자는 Oracle 구문을 사용했지만 ISO 표준에서 이에 대해 언급 한 내용을 알고 싶습니다.
특정 예에서 DUAL
테이블에 대해 쿼리하고 있기 때문에 순서가 변경되어서는 안되며 특정 쿼리의 잠재적 인 인덱스 변경에 대해 걱정할 필요가 없습니다. 그래서 당신은 언제나 Foo와 Bar를 각각 얻을 것입니다.
그러나 실세계에서는 주문이 가장 확실하게 바뀔 수 있습니다. 테이블 색인, 반환되는 열, 새 데이터가 도입되는 등 여러 요인에 따라 달라질 수 있습니다. 결과가 특히, ORDER BY
절을 지정해야합니다.
희망이 도움이됩니다. 쿼리의
하기 권장 재 작성 :
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
감사합니다. 이것은 매우 간단합니다. 나는 그러한 재 작성이 전혀 필요하지 않은지 궁금해하고 있었다. –
다른 사람들이 말했듯이, 아마 괜찮을 지 모르지만, 지정하지 않으면 보장되지 않습니다. – invertedSpear
ISO 표준 테이블은 본질적으로 정렬되지 않은 것을 말한다. 또한 쿼리에서 행을 반환 할 때 order by
절을 사용하지 않는 한 은 주문의 보증을 의미합니다.
연습에서 대부분의 데이터베이스는이 경우 막대 앞에 foo를 반환합니다. 그러나 union all
을 union
으로 변경하면 일부 데이터베이스가 먼저 막대를 반환합니다.
더 나쁜 것은 첫 번째 쿼리의 모든 행이 두 번째 전에 반환된다고 말할 수조차 없다는 것입니다. 예를 들어, 병렬 환경에서는 공용체의 결과 세트가 두 테이블 모두를 사용하여 행을 혼합 할 수 있습니다.
먼저 foo를 원하면 order by txt desc
또는 그 효과를 추가하십시오.
"SQL 세계에서 주문은 데이터 집합의 본질적인 속성이 아니므로 데이터가 특정 순서로 또는 심지어 일관된 순서로 되돌아 올 것이라고 보장 할 수 없습니다. ORDER BY 절을 사용하여 데이터를 쿼리하지 않는 한. " – showdev
주문이 보장되는지 여부는 모르겠지만 다른 쿼리로이 쿼리를 묶은 다음 수동으로 결과를 정렬 할 수 있습니다. SELECT * FROM (선택 'foo', col_1 ... UNION). ..) ORDER BY col_1'. 적어도 그러한 쿼리는 장황하고 명확합니다. – Crozin