2

在这个查询中,除了 5 个连接表之外,我正在尝试使用第 6 个表“Days”将值与连接中的三个表进行比较。但它给了我错误,我不能在连接中使用子查询。

select
a.ID, a.Name, a.AMT, b.Address, c.Date, c.Pay, d.Check
from
Table1 a 
left outer join Table2 b        on a.ID = b.ID
left outer join Table3 c    on a.ID = c.ID and c.Date= (select Derived_date from  Days where TODAY_DATE = TO_DATE(SYSDATE, 'YYYY/MM/DD'))
left outer join Table4 d    on a.ID = d.ID and d.Date= (select Derived_date from Days where TODAY_DATE = TO_DATE(SYSDATE, 'YYYY/MM/DD'))
left outer join Table5 e    on a.ID = e.ID and e.Date= (select Derived_date from Days where TODAY_DATE = TO_DATE(SYSDATE, 'YYYY/MM/DD'))
4

1 回答 1

3

尝试在ON子句中使用子选择不会很好地工作。你需要JOIN像其他任何桌子一样回到它。由于您的子选择对于每个 single 都是相同的JOIN,因此我首先将其放入 (temp?) 表中,这样您就可以JOIN正常使用它,而不必SELECT三次使用相同的数据。

CREATE TABLE Derived_Dates AS SELECT Derived_date FROM Days WHERE TODAY_DATE = TO_DATE(SYSDATE, 'YYYY/MM/DD')

SELECT a.ID, a.Name, a.AMT, b.Address, c.Date, c.Pay, d.Check
FROM Table1 a LEFT OUTER JOIN Table2 b on a.ID = b.ID
    LEFT OUTER JOIN Table3 c ON a.ID = c.ID
    LEFT OUTER JOIN Table4 d ON a.ID = d.ID
    LEFT OUTER JOIN Table5 e ON a.ID = e.ID
    INNER JOIN Dervied_date dt ON c.Date = dt.Derived_date
        AND d.Date = dt.Derived_date
        AND e.Date = dt.Derived_date

以下是您可以如何使用您的子选择:

SELECT a.ID, a.Name, a.AMT, b.Address, c.Date, c.Pay, d.Check
FROM Table1 a LEFT OUTER JOIN Table2 b on a.ID = b.ID
    LEFT OUTER JOIN Table3 c ON a.ID = c.ID
    LEFT OUTER JOIN Table4 d ON a.ID = d.ID
    LEFT OUTER JOIN Table5 e ON a.ID = e.ID
    INNER JOIN (SELECT Derived_date FROM Days WHERE TODAY_DATE = TO_DATE(SYSDATE, 'YYYY/MM/DD')) dt ON c.Date = dt.Derived_date
        AND d.Date = dt.Derived_date
        AND e.Date = dt.Derived_date

您也可以只使用一个子句,而不是JOIN返回您的派生日期。WHERE您有一些选择,并且您可能希望对您的特定实现进行一些更改,但这或多或少是我处理这个问题的方式。

于 2013-10-31T16:11:00.290 回答