2014-02-28 17 views
0

我正在試圖做一個簡單的左連接與2 ID的表 - 基本上是一個ID和子ID。每一行都有一個ID,但不一定是一個Sub-ID。當一個子標識存在時,我想根據該標識加入,如果不加入標識。我想像像CASE語句的JOIN ON子句取決於字段是否爲NULL?

SELECT ... 
FROM tablename a 
LEFT JOIN tablename b 
ON CASE WHEN SUB_ID IS NOT NULL THEN 
    a.SUB_ID = b.SUB_ID 
ELSE 
    a.ID = b.ID END 
AND 
    a.otherfield = b.otherfield 

但我無法得到任何像這樣的工作,所以不是我不得不這樣做2個查詢使用UNION(一個在SUB_ID加入WHERE SUB_ID IS NOT NULL,另一個加入ID WHERE SUB_ID是空的。)它的工作,但我無法想象有沒有辦法做到這一點。如果有幫助,我的ID和SUB_ID值如下所示:

ID   SUB_ID 
10000  NULL 
10001  NULL 
10001  10001-3 
10001  10001-5 
10014  NULL 

有關如何在沒有建立UNION的情況下實現此目的的任何建議?提前致謝!!

回答

1

我們可以用COALESCE用於此目的:一是不爲空參數

SELECT ... 
FROM tablename a 
LEFT JOIN tablename b 
ON COALESCE(a.SUB_ID,a.ID) = COALESCE(b.SUB_ID,b.ID) 

COALESCE收益值從左邊。

這裏是SQL Fiddle

+0

感謝大家的反饋,可能很多的解決方案的工作,這只是一個我第一次嘗試,並獲得結果我在尋找。謝謝! – Jay

2

這應該適合你。

SELECT ... 
FROM tablename a 
    LEFT JOIN tablename b 
     ON ((b.SUB_ID IS NOT NULL AND a.SUB_ID = b.SUB_ID) OR 
      (a.ID = b.ID)) 
     AND a.otherfield = b.otherfield 
0

您可以將表兩次:

SELECT ... 
FROM tablename a 
    LEFT JOIN tablename b 
     ON a.SUB_ID = b.SUB_ID 
     AND a.otherfield = b.otherfield 
    LEFT JOIN tablename c 
     ON a.ID = b.ID 
     AND a.SUB_ID IS NULL 
     AND a.otherfield = c.otherfield 

然後使用ISNULL獲得的列,例如

ColumnName = ISNULL(b.ColumnName, c.ColumnName) 

這取決於你的索引,但我懷疑這可能會比優化爲條件加入條款更好。

0

有趣。

SELECT ... 
FROM tablename a 
    LEFT JOIN tablename b 
     ON (
     a.SUB_ID = b.SUB_ID 
     OR (a.SUB_ID IS NULL AND b.SUB_ID IS NULL AND a.ID = b.ID) 
     ) 
     AND a.otherfield = b.otherfield 

這可能會奏效。雖然這不會很快。

根據你的數據,你想達到什麼樣的狀態,你可能想在加入條款更改爲

 ON (
      a.SUB_ID = b.SUB_ID 
     OR (a.SUB_ID IS NULL AND a.ID = b.ID) 
     OR (b.SUB_ID IS NULL AND a.ID = b.ID) 
     ) 
     AND a.otherfield = b.otherfield 

...相反。

0

代碼嘗試是這樣的:

SELECT * 
FROM TABLENAME A 
LEFT JOIN TABLENAME B 
    ON (A.SUB_ID IS NOT NULL AND A.SUB_ID = B.SUB_ID) 
    OR (A.SUB_ID IS NULL AND A.ID = B.ID)