2014-06-17 45 views
1

我想寫一個sql語句來獲取表中的兩列的描述。但是,a.code_2列中的某些行是空的,不需要獲取描述。我的sql語句如下所示。它只抓取在code_1和code_2中都有值的列,而不是其中a.code_2爲空的行。寫一個sql語句與案例

SELECT ID, CODE_1, B.CODE_DESC, CODE_2, C.CODE_DESC 
    FROM TBLCODE A, TBLDESC B, TBLDESC C 
    WHERE A.CODE_1 = B.CODE1 
    AND A.CODE_2 = (CASE WHEN a.CODE_2 IS NULL THEN '' ELSE C.CODE1 END); 
+2

[不良習慣踢:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - 舊式*逗號分隔的表*樣式列表已停止使用ANSI - ** 92 ** SQL標準(超過** 20年前**) –

回答

0

它看起來像你想的內部連接到TBLDESCCODE_1,只要是永遠不能爲null;和外部連接到CODE_2的同一張表。當CODE_2爲空將無法找到任何內容,因此C.CODE_DESC將爲空 - 但將其設爲外部聯接意味着TBLCODE記錄不會被丟棄,這就是您現在看到的內部聯接:

SELECT A.ID, A.CODE_1, B.CODE_DESC AS DESC_1, A.CODE_2, C.CODE_DESC AS DESC_2 
FROM TBLCODE A 
JOIN TBLDESC B ON B.CODE1 = A.CODE_1 
LEFT JOIN TBLDESC C ON C.CODE1 = A.CODE_2; 

如果CODE_1可能爲空,則使它們都爲LEFT JOIN

如果你不想兩次打表,你可以使用一個外連接,然後CASE來決定哪一個去哪裏,但有點混亂;爲的小十歲上下的查找表,它可能是不值得的:

SELECT A.ID, A.CODE_1, 
    MAX(CASE WHEN B.CODE1 = A.CODE_1 THEN B.CODE_DESC END) AS DESC_1, 
    A.CODE_2, 
    MAX(CASE WHEN B.CODE1 = A.CODE_2 THEN B.CODE_DESC END) AS DESC_2 
FROM TBLCODE A 
LEFT JOIN TBLDESC B ON B.CODE1 IN (A.CODE_1, A.CODE_2) 
GROUP BY A.ID, A.CODE_1, A.CODE_2 
ORDER BY A.ID; 

SQL Fiddle

+0

謝謝!它很棒! – BringQBasicBack

0

您需要閱讀連接(內部和外部)。我也不完全確定你在用TBLDESC C做什麼,但這是我最好的猜測。左連接意味着「顯示左側的所有列,而不管它們是否加入了右側的任何內容」。

SELECT ID, CODE_1, B.CODE_DESC, CODE_2, B.CODE_DESC 
FROM TBLCODE AS A 
LEFT JOIN TBLDESC AS B ON A.CODE_1 = B.CODE1