2017-11-10 13 views
0

나는 테이블을 단순화했지만 근본적으로 cycle_no 및 종료 날짜가있는 계정 테이블이 있습니다. 이 종료일은 항상 첫 번째 달로 설정되지만 캘린더 세부 정보 표를보고 실제 종료일을 가져와야합니다. 실제 종료일은이주기의 다음 날짜입니다. 오라클의 하위 쿼리에서 참조 테이블

는 간단한 테이블을 생성하고 데이터의 몇 행을 입력 :

CREATE TABLE DATA_OWNER.ACCOUNT 
(
    ACCNO  NUMBER(4), 
    CYCLE_NO NUMBER(4), 
    ENDDATE DATE 
); 

CREATE TABLE DATA_OWNER.CALENDAR_DETAILS 
(
    CALENDAR_DT DATE, 
    BILL_CYCL_NO NUMBER(4) 
); 

INSERT INTO calendar_Details 
VALUES 
('18/DEC/2017', 
17); 

INSERT INTO calendar_Details 
VALUES 
('23/DEC/2017', 
20); 

INSERT INTO calendar_Details 
VALUES 
('18/JAN/2018', 
17); 

INSERT INTO calendar_Details 
VALUES 
('23/JAN/2018', 
20); 

INSERT INTO calendar_Details 
VALUES 
('20/FEB/2018', 
17); 

INSERT INTO calendar_Details 
VALUES 
('21/FEB/2018', 
20); 

INSERT INTO account 
VALUES 
(1, 17, '01/DEC/2107'); 

INSERT INTO account 
VALUES 
(2, 20, '01/DEC/2107'); 

우리가 "ACC"을 얻을 수 있지만 우리는이 쿼리를 실행합니다. "ENDDATE": 유효하지 않은 식별자 :

SELECT accno, cycle_no, enddate, actual_date 
FROM account acc 
JOIN 
(
    SELECT MIN(calendar_dt) actual_date 
    FROM calendar_details cal 
    WHERE calendar_dt > acc.enddate 
) 
ON acc.cycle_no = cal.bill_cycl_no; 

누구든지이 기능을 수행하는 가장 좋은 방법을 알려주시겠습니까?

+0

오라클 버전은 무엇입니까? 12.1에서 'lateral'등을 사용할 수 있습니다. –

+0

11g R2 – PinkSalmon

답변

1

FROM의 하위 쿼리에서 외부 테이블 참조를 참조 할 수 없습니다. 상관 하위 쿼리를 사용하십시오.

SELECT accno, cycle_no, enddate, 
     (SELECT MIN(cal.calendar_dt) as actual_date 
     FROM calendar_details cal 
     WHERE cal.calendar_dt > acc.enddate AND acc.cycle_no = cal.bill_cycl_no 
     ) as actual_date 
FROM account acc; 
+0

답장을 보내 주셔서 감사합니다. 당신이 말하는 것을 볼 수 있지만 쿼리를 실행할 때 결과의 actual_date 열에 값이 없습니다. – PinkSalmon

+0

@ PinkSalmon. . . 아마도주기 정보가 일정 세부 정보 표에 존재하지 않을 수 있습니다. –

+0

그냥 내 만든 데이터라고 생각하지만 실제 테이블을 사용하는 쿼리의 기초로 이것을 사용하면 효과가있는 것 같습니다. 때로는 나무의 나무를 볼 수 없습니다. 다시 한번 감사드립니다. – PinkSalmon