2012-07-20 32 views
0

這想出了在工作,這真的只是看起來像一個謎......爲什麼這個離開連接似乎沒有按預期工作?

查詢1:

SELECT * FROM 
SYSIBM.SYSTABLES A LEFT JOIN 
SYSIBM.SYSTABLESPACE B 
ON A.DBNAME = B.DBNAME 
AND A.TSNAME = B.NAME 
AND A.TSNAME LIKE 'HIB%' 
; 

此查詢不上HIB%標準,相反的是,它看起來像查詢過濾器應該做的。我會認爲把這個標準放在JOIN中應該會產生相同的結果。

查詢2項按預期工作:

SELECT * FROM 
(SELECT * FROM SYSIBM.SYSTABLES 
WHERE TSNAME LIKE 'HIB%') A 
LEFT JOIN 
SYSIBM.SYSTABLESPACE B 
ON A.DBNAME = B.DBNAME 
AND A.TSNAME = B.NAME 
; 

什麼是錯的第一個查詢?

回答

4

TRY

SELECT * FROM SYSIBM.SYSTABLES A 
LEFT JOIN SYSIBM.SYSTABLESPACE B 
    ON A.DBNAME = B.DBNAME AND A.TSNAME = B.NAME 
WHERE A.TSNAME LIKE 'HIB%' ; 

當你把條件在左側加入一個用於過濾的加盟記錄,但由於是左連接它返回從表格中的所有記錄因爲你對此沒有任何條件。

現在,如果條件在表B上,它就會有所不同。它屬於左連接(除非它是像B.id這樣的東西),否則你將把查詢變回內連接。

+0

因此,如果我正確理解這一點,'LEFT JOIN'將覆蓋我想要在'JOIN'中做的任何一種過濾? – avgvstvs 2012-07-20 18:06:28

+0

第二個表上左連接過濾器的ON子句不是第一個。它將返回第一個表中的所有記錄,除了那些通過WHERE子句過濾的記錄。 – HLGEM 2012-07-20 18:13:22

2

您是否試圖將「喜歡」 - 部分移至where子句?

SELECT * 
FROM SYSIBM.SYSTABLES A 
LEFT JOIN SYSIBM.SYSTABLESPACE B ON A.DBNAME = B.DBNAME AND A.TSNAME = B.NAME 
WHERE A.TSNAME LIKE 'HIB%' 
; 
相關問題