【问题标题】:Oracle SQL Conditional Outer Join using case statement使用 case 语句的 Oracle SQL 条件外连接
【发布时间】:2013-03-23 05:12:00
【问题描述】:

假设我有三个表:

1. TableA with columns TableAID (PK), Desc Nullable

2. TableB with columns TableBID (PK), TableAID(FK) Nullable

3. TableC with columns TableCID (PK), TableBID (FK) Nullable, 
   TableAID (FK) Nullable, Start_Date, End_Date

我需要返回表 A 中的 Desc 如果 TableC.TableBID 不为空,则使用 TableB 中的 TableAID(FK) 来检索 Desc 别的 在 TableC 中使用 TableAID (FK) 来检索 Desc

注意:TableC.TableBID 或 TableC.TableAID 都可能为空。在所有情况下,我仍然必须能够返回 TableC 中的其他列。

这是我的代码:

Select ta.desc, tc.start_date, tc.end_date
from TableC tc
Left outer join TableB tb
on case
when tc.TableBID  is not null then (
           tc.TableBID = tb.TableBID
           Left outer join TableA ta
           on tb.TableAID = ta.TableAID 
           --my concern here is that tb.TableAID can be null. Will it still work?
)
else tc.TableAID = ta.TableAID --my concern here is that tc.TableAID can be null. 
--WIll it still work?

我也关心语法。如果有更好的有条件加入的方法,请告知。我正在使用甲骨文。此代码将进入一个视图,该视图将用于搜索过程(这就是为什么它必须返回所有内容而不考虑空值)。 感谢您的帮助。

【问题讨论】:

    标签: sql oracle join outer-join case-statement


    【解决方案1】:

    您可以将CASE 放在SELECT 子句中并相应地加入表,如下所示:

    SELECT CASE
               WHEN tb.tableAID IS NOTNULL THEN tab.desc
               ELSE tac.desc
           END AS desc
           -- or better: NVL(tab.desc, tac.desc) AS desc
           , tc.start_date
           , tc.end_date
      FROM tableC tc
      JOIN tableB tb ON tc.tableBID = tb.tableBID
      LEFT JOIN tableA tab ON tab.tableAID = tb.tableAID
      LEFT JOIN tableA tac ON tac.tableAID = tc.tableAID
    

    【讨论】:

    • 感谢您抽出宝贵时间阅读并理解我的问题。我不知道 nvl/case 可以放在 case 语句中。此外,我不知道我可以像您那样加入表格而不产生某种笛卡尔积。我使用了 nvl 和你建议的连接设置,它有效!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多