2017-02-21 58 views
2

我想LEFT JOIN 3個表,像這樣:如何創建有條件的LEFT JOIN?

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個,我想解決的基本情況:

  1. @CustomerID <> 0,@ProductID存在於T1僅
  2. @CustomerID <> 0和@ProductID存在於t1和t2
  3. @CustomerID = 0和@ProductID存在於T1僅
  4. @客戶ID = 0和@ProductID存在於T1和T2

上面的代碼工作的情況下1-3,但萬一4.返回什麼,我想這是因爲最後的LEFT JOIN中斷(即使這兩個數據存在對於@ProductID,t1和t2)。

有沒有辦法讓第二個LEFT JOIN條件不使用IF ... ELSE邏輯?

回答

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 
+0

謝謝,成功了! –

0

如果我知道你想什麼,這可能工作:

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