2013-12-13 133 views
0

我試圖運行這個連接,但我沒有收到正確的值。SQL連接結果錯誤

我的第一個查詢返回像25000的記錄

SELECT count(*) from table1 as DSO, 
table2 as EAR 
WHERE 
(UCASE(TRIM(EAR.value)) = UCASE(TRIM(DSO.value)) 
AND 
UCASE(TRIM(EAR.value1) = UCASE(TRIM(DSO.value1)) 

我的第二個查詢返回喜歡3000000

SELECT count(*) from table1 as DSO 
left join table2 as EAR, 
ON 
(UCASE(TRIM(EAR.value)) = UCASE(TRIM(DSO.value)) 
AND 
UCASE(TRIM(EAR.value1) = UCASE(TRIM(DSO.value1)) 

總的表1的記錄是像45,000這就是我應該收到。

+0

對於table1中的部分或全部記錄,您可能在table2中有多個匹配項。它將返回每個案例的記錄,以及沒有匹配的每個案例的記錄。 – beercodebeer

+0

WHERE EAR.value IS NOT NULL – Kashif

+0

與'WHERE'子句連接的多個與'INNER JOIN'相同,通常縮寫爲JOIN。 'LEFT JOIN'將會有不同的結果,因爲它也顯示'DSO'中的所有記錄,而'EAR'中沒有匹配。 – Aquillo

回答

0

第一個查詢是一個INNER JOIN,第二個查詢是一個LEFT JOIN。你應該期待完全不同的結果。另外,請看db2400使用UCASE和TRIM函數處理NULL的方式。我的猜測是你的左連接正在進行一些你不想要的比賽。

第一個查詢中的INNER JOIN將從table1中排除table2中沒有匹配的任何記錄。這很快解釋了更低的計數。

如果在table2中發現多個匹配項,那麼任何連接都將愉快地爲table1中的每條記錄創建多個行。不同之處在於,LEFT JOIN也將爲table1中的每個記錄創建一行,這在table2中沒有匹配。這聽起來像你期望在兩張桌子之間有1:1的比賽,但這不是你所得到的。