假设我有一个简化的表结构如下:
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中的值。
答案 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
)