如何创建有条件的 LEFT JOIN?
Posted
技术标签:
【中文标题】如何创建有条件的 LEFT JOIN?【英文标题】:How do I create a conditional LEFT JOIN? 【发布时间】:2017-02-21 15:53:31 【问题描述】:我正在尝试像这样 LEFT JOIN 3 个表:
DECLARE @CustomerID AS INT;
DECLARE @ProductID AS INT;
SELECT *
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
LEFT JOIN table3 t3 ON t2.loc = t3.loc
WHERE t1.id = @ProductID
AND (t2.loc = t3.loc OR t2.loc IS NULL)
AND (t3.cid = @CustomerID OR t3.cid IS NULL)
我正在尝试解决 4 种基本情况:
-
@CustomerID 0 和 @ProductID 仅存在于 t1 中
@CustomerID 0 和 @ProductID 存在于 t1 和 t2 中
@CustomerID = 0 且 @ProductID 仅存在于 t1 中
@CustomerID = 0 且@ProductID 存在于 t1 和 t2 中
上面的代码适用于案例 1-3,但在案例 4 中不返回任何内容。我认为这是因为最后一个 LEFT JOIN 中断(即使该 @ProductID 的数据在 t1 和 t2 中都存在)。
有没有办法在不使用 IF...ELSE 逻辑的情况下使第二个 LEFT JOIN 成为条件?
【问题讨论】:
【参考方案1】:将条件放在on
子句中,而不是where
子句中
SELECT *
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
LEFT JOIN table3 t3 ON t2.loc = t3.loc
AND (t3.cid = @CustomerID OR t3.cid IS NULL)
AND (t2.loc = t3.loc OR t2.loc IS NULL)
WHERE t1.id = @ProductID
【讨论】:
谢谢,成功了!【参考方案2】:如果我明白你想要什么,这可能会奏效:
SELECT * FROM table1 a
LEFT JOIN table2 b
ON b.id = a.id
LEFT JOIN table3 c
ON c.loc = b.loc
and isNull(c.cid, @CustomerID) = CustomerID
WHERE t1.id = @ProductID
【讨论】:
以上是关于如何创建有条件的 LEFT JOIN?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 LEFT JOIN 创建 JPA NamedQuery
创建一个视图,让您向 LEFT JOIN ... ON? 添加条件?
Inner Join and Left Join 与条件的结合