让我们说我有三张桌子:
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不为null,则使用TableB中的TableAID(FK)来检索Desc 其他 使用TableC中的TableAID(FK)来检索Desc
注意:TableC.TableBID或TableC.TableAID都可以为null。在所有情况下,我仍然必须能够返回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?
我也关心语法。如果有更好的方式进行有条件的加入,请告知。我正在使用oracle。此代码将进入一个将用于搜索过程的视图(这就是为什么它必须返回所有内容而不管空值)。 谢谢你的帮助。
答案 0 :(得分:0)
您可以将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