단일 SQL에 여러 "WITH AS"를 사용할 수 있습니까?-Oracle SQL


102

저는 매우 간단한 질문을했습니다. 오라클은 단일 SQL 문에서 여러 "WITH AS"를 허용합니까?

예:

WITH abc AS( select ......)

WITH XYZ AS(select ....) /*This one uses "abc" multiple times*/

Select ....   /*using XYZ multiple times*/

동일한 쿼리를 여러 번 반복하여 쿼리가 작동하도록 만들 수 있지만 그렇게하고 싶지 않고 "WITH AS"를 활용합니다. 간단한 요구 사항처럼 보이지만 오라클은 나를 허용하지 않습니다.

ORA-00928 : SELECT 키워드가 없습니다

답변:


190

다음과 같이 할 수 있습니다.

WITH abc AS( select
             FROM ...)
, XYZ AS(select
         From abc ....) /*This one uses "abc" multiple times*/
  Select 
  From XYZ....   /*using abc, XYZ multiple times*/

2
첫 번째 하위 쿼리의 별칭을 두 번째 하위 쿼리로 사용할 수 있습니까? 이 경우 abcxyz하위 쿼리? 첫 번째 하위 쿼리의 결과를 가져 와서 두 번째 하위 쿼리에서 사용해야합니다.
Wax

@Wax 위의 답변에서 알 수 있듯이 두 번째 하위 쿼리에서 첫 번째 하위 쿼리의 별칭을 문제없이 사용할 수 있습니다. 또한 기본 쿼리에서 두 테이블의 별칭과 열을 사용할 수있었습니다.
cleberz

완벽한 대답입니다.
InfiniteFlash

29

올바른 구문은-

with t1
as
(select * from tab1
where conditions...
),
t2
as
(select * from tab2
where conditions...
(you can access columns of t1 here as well)
)
select * from t1, t2
where t1.col1=t2.col2;

5
"여기에서도 t1의 열에 액세스 할 수 있습니다."라는 점을 지적하는 데 매우 유용했습니다.
Bren

10

그래 넌 할수있어...

WITH SET1 AS (SELECT SYSDATE FROM DUAL), -- SET1 initialised
     SET2 AS (SELECT * FROM SET1)        -- SET1 accessed
SELECT * FROM SET2;                      -- SET2 projected

10/29/2013 10:43:26 AM

공통 테이블 표현식에서 초기화해야하는 순서를 따릅니다.


3

Aditya 또는 다른 사람, 귀하의 예제에서 t2를 t1과 결합하거나 일치시킬 수 있습니까?

with t1 as (select * from AA where FIRSTNAME like 'Kermit'),
     t2 as (select * from BB B join t1 on t1.FIELD1 = B.FIELD1)

조인에 WHERE 만 지원되는지 또는 두 번째 WITH 엔터티 내에서 어떤 조인 접근이 지원되는지 확실하지 않습니다. 일부 예제에는 WITH 절의 "아래"선택 본문에 WHERE A = B가 있습니다.

이 WITH 선언을 따르는 오류는 B의 식별자 (필드 이름)가 인식되지 않고 나머지 SQL 본문에 있다는 것입니다. 따라서 WITH 구문은 정상적으로 실행되는 것처럼 보이지만 t2의 결과에 액세스 할 수 없습니다.


절이있는 t2 내에서 t1을 별칭으로 지정해야합니다
Ben

하위 쿼리 내에서 절 테이블을 어떻게 참조 할 수 있습니까? 오류가 발생합니다. 예 : WITH SET1 AS (SELECT SYSDATE FROM DUAL),-SET1 초기화 SET2 AS (SELECT * FROM SET1)-SET1 액세스 SELECT * FROM SET2 LEFT OUTER JOIN (select * from SET1 where sysdate = now ()) set3 on set1.sysdate = set3.sysdate;
Rupasa Sushma
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.