Oracle中子查询的引用表

时间:2017-11-10 14:05:36

标签: sql oracle subquery

我简化了我的表格,但基本上我有一个包含cycle_no和结束日期的帐户表。此结束日期始终设置为该月的第一天,但​​我需要通过查看日历详细信息表来获取实际结束日期。实际结束日期是此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;

有人能给我们一些关于实现这个目标的最佳方法吗?

1 个答案:

答案 0 :(得分: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;