복붙노트

[SQL] 오라클 UNION 및 ORDER BY와 호기심 문제

SQL

오라클 UNION 및 ORDER BY와 호기심 문제

다음 쿼리는 오라클을 포함한 거의 모든 데이터베이스 (제공 또는 듀얼 더미 테이블을)에서 완벽하게 유효합니다 :

select 'A' as x from dual union all
select 'B'      from dual
order by x asc

반환 :

| X |
|---|
| A |
| B |

이제이 쿼리는 여전히 매우 표준 SQL,하지만 오라클에서 작동하지 않습니다

select 'A' as x from dual union all
select 'B'      from dual union all
select 'C'      from dual
order by x asc

나는군요

ORA-00904: "X": invalid identifier

그러나 이것은 작동합니다 :

select 'A' as x from dual union all
select 'B' as x from dual union all
select 'C'      from dual
order by x asc

나는이 문제에 놀아, 그 분명히 적어도 첫번째 부속 및 열라는 X이 두 번째 - 마지막 (?) 부속 필요성을 파악했습니다. 첫 번째 예에서는 두 개의 부속 선택은 단순히 맞춰 보였다. 예를 들어 작업 :

select 'A' as x from dual union all
select 'B'      from dual union all
select 'C'      from dual union all
select 'D'      from dual union all
select 'E'      from dual union all
select 'F' as x from dual union all
select 'G'      from dual
order by x asc

당신이 짐작 할 수 있습니다,이 작동하지 않을 것입니다 :

select 'A' as x from dual union all
select 'B'      from dual union all
select 'C'      from dual union all
select 'D'      from dual union all
select 'E' as x from dual union all
select 'F'      from dual union all
select 'G'      from dual
order by x asc

파생 테이블은 이러한 제한으로 고생하지 않는 것 같다. 이 작품 :

select * from (
  select 'A' as x from dual union all
  select 'B'      from dual union all
  select 'C'      from dual
)
order by x asc

ORDER BY 절에서 참조 절대적으로 이름의 열을 유지하기 위해 제 1 및 제 2 - 마지막 부속을 필요로하는 언어 구문에있는 아주 미묘한 디테일이이 오라클 SQL 파서에 (알려진?) 버그, 또는이다 ?

해결법

  1. ==============================

    1.이건 정말 질문에 대답하지 않지만 파서 버그 (또는 '기능')가 아닌 언어 요구 사항을 것 같다.

    이건 정말 질문에 대답하지 않지만 파서 버그 (또는 '기능')가 아닌 언어 요구 사항을 것 같다.

    내 오라클 지원에 따르면,이 버그 14,196,463으로 제기하지만 해상도가 폐쇄 된 것으로 보인다. 또한 당신이 그 생각 중 하나보고하는 MOS 계정이 필요하거나, 적어도 오라클 계정 커뮤니티 스레드 3561546.에서 언급 한 것.

    또한 지금까지 내가 말할 수있는, 오히려 MOS 계정이 아닌 기본 오라클 로그인을 필요로하는 OTN 스레드에서 논의되고있다. 그것도 많은 정보를 가지고 있지만 당신의 결과를 반복하고, 또한 행동이 아마 훨씬 이전 9.2.0.8에 다시 이상 존재하고있다 제시하지 않습니다.

    문서는 약간 모호하지만, 이것이 문제가 될 것으로 예상된다 나타내지 않습니다 :

    당신은 당신의 발현을 앨리어싱 및 그 사용, 그것은 당신이 특정 구성 요소 (물론이 말을하지 않지만 당신도 필요 없어) 별명이 말을하지 않습니다 있습니다.

    동작은 별명이 최종 투사 유효 인과 일치하지 않는 것, 그리고 별명은 ORDER BY 절에서 유효한 것에 대해 일반적인 규칙 -이 사이 어딘가에 떨어지는 것으로 보인다.

  2. ==============================

    2.당신이 당신의 현재 쿼리에서 일치하지 않는 행동을 얻고있는 이유가 여기에 대답하지 않지만, 오라클에 쉽게 (잘못된 식별자 오류로 실패해서는 안)은 다음과 같이 다시 작성할 수 있습니다 :

    당신이 당신의 현재 쿼리에서 일치하지 않는 행동을 얻고있는 이유가 여기에 대답하지 않지만, 오라클에 쉽게 (잘못된 식별자 오류로 실패해서는 안)은 다음과 같이 다시 작성할 수 있습니다 :

    with t(x) as (
      select 'A' from dual
      union all
      select 'B' from dual
      union all
      select 'C' from dual
    )
    select * from t
    order by x asc
    

    추가 보너스로 당신은 한 번만 열 별칭 (X)를 지정할 수있다.

  3. from https://stackoverflow.com/questions/25387951/curious-issue-with-oracle-union-and-order-by by cc-by-sa and MIT license