Oracle - 条件连接消除了不必要的附加连接

时间:2017-09-20 10:22:43

标签: sql database oracle join

假设我有一个简化的表结构如下:

Table A - ID (PK)
Table B - ID (PK), AID = FK to Table A
Table C - ID (PK), BID = FK to Table B
Table D - ID (PK), CID = FK to Table C

查询类似的内容:

SELECT * FROM TABLE_A TBLA
LEFT JOIN TABLE_B TBLB ON TBLA.ID = TBLB.AID
LEFT JOIN TABLE_C TBLC ON TBLB.ID = TBLC.BID
LEFT JOIN TABLE_D TBLD ON TBLC.ID = TBLD.CID

这是相对简单的,但我想做的是某种条件连接,因为我想要表A中的所有记录,但想要加入表B - >表C - >表D如果满足表A和表B之间的第一次连接,请记住我可以更改表B - >表C - >表D连接为INNER,因为表A和表B之间的初始连接中存在满足.-

但是我也需要在表D上有一个WHERE条件。

所以基本上想要消除TABLE_B,TABLE_C,TABLE_D之间的LEFT JOIN,其中TABLE_A和TABLE_B之间的连接不满足。

非常简化的数据如此道歉!

| Table A |
| ID      |
| 1       |
| 2       |
| 3       |
| 4       |
| 5       |

| Table B  |
| ID | AID |
| 1  | 5   |

| Table C  |
| ID | BID |
| 1  | 1   |

| Table D          |
| ID | CID | Value |
| 1  | 1   | ABC   |

我想要消除连接的原因是,对于表A中的5行中的4行,我在三个表中进行不必要的连接以获得表D中的值。

1 个答案:

答案 0 :(得分:0)

你可以使用括号加入,但不确定这是否对你有用!

SELECT * FROM 
TABLE_A TBLA
LEFT JOIN (TABLE_B TBLB 
           INNER JOIN TABLE_C TBLC ON TBLB.ID = TBLC.BID
           INNER JOIN TABLE_D TBLD ON TBLC.ID = TBLD.CID) ON TBLA.ID = TBLB.AID

这样,当你在B中有A匹配条目,但是链中的B与C和D不匹配时,不检索B数据,因此对于C

你提到你需要表D上的where条件?这是否意味着你总是要链接到D ?!请注意,如果您在D上有条件,则必须在所有情况下满足条件。因此,当没有从D检索记录时,将不会从查询中检索任何记录(即使使用您的初始外部联接,除非您使用OR .. is null