2013-04-02 75 views
0

請看下面2關於左外連接的問題,並告訴我爲什麼有差異。 Query 1返回1489行:左外連接有趣的結果

SELECT distinct a.GMS_MATERIALNUMBER,a.MATERIAL_DESCRIPTION, b.LDMC 
FROM [AP_GDC2_PREPARATION_TEST].[dbo].[GDM_AUTOPULL] a 
left outer join [AP_GDC2_STAGING_TEST].[dbo].[CFS_DIS_LDMC] b on 
a.GMS_MATERIALNUMBER = b. GMS_MATERIALNUMBER and b.SAP_COMPANY_CODE= '1715' 
and a.CFS_ORGANIZATION_CODE like 'rd_kr' 

Query 2僅返回295行賦予相同的行數的,當我做一個簡單的選擇*從其中CFS_ORGANIZATION_CODE像「rd_kr」

SELECT distinct a.GMS_MATERIALNUMBER,a.MATERIAL_DESCRIPTION, b.LDMC 
FROM [AP_GDC2_PREPARATION_TEST].[dbo].[GDM_AUTOPULL] a 
left outer join [AP_GDC2_STAGING_TEST].[dbo].[CFS_DIS_LDMC] b on 
a.GMS_MATERIALNUMBER = b. GMS_MATERIALNUMBER and b.SAP_COMPANY_CODE= '1715' 
where a.CFS_ORGANIZATION_CODE like 'rd_kr' 

基本上query 2是我想要的結果,但我的問題是爲什麼query 1不起作用?在涉及left outer join中的ON子句時,SQL服務器到底在後臺工作的究竟是什麼?

乾杯

回答

0

所不同的是,因爲你做了LEFT JOIN。 因此,您可以從第一張表中獲取所有行,並從第二張表中獲取所有匹配的行。

在第二個查詢中,您首先在JOIN之後,並在您設置WHERE語句後減少結果。

2

兩者的字面意思不同。

在加入表之前,第一個查詢執行表的過濾。

第二個過濾器從加入表後的總結果完成。


下面是一個例子

表1

ID Name 
1 Stack 
2 Over 
3 Flow 

表2

T1_ID Score 
1  10 
2  20 
3  30 

在第一個查詢,它看起來像這樣,

SELECT a.*, b.Score 
FROM Table1 a 
     LEFT JOIN Table2 b 
      ON a.ID = b.T1_ID AND 
       b.Score >= 20 

它在加入表之前,首先按照得分過濾table2的記錄。因此,將表1上被連接的唯一記錄

T1_ID Score 
2  20 
3  30 

因爲T1_IDScore只有10。查詢的結果是

ID Name Score 
1 Stack NULL 
2 Over 20 
3 Flow 30 

而第二個查詢是不同的。

SELECT a.*, b.Score 
FROM Table1 a 
     LEFT JOIN Table2 b 
      ON a.ID = b.T1_ID 
WHERE b.Score >= 20 

它首先加入記錄是否在另一張桌子上有匹配的記錄。因此,其結果將是

ID Name Score 
1 Stack 10 
2 Over 20 
3 Flow 30 

和過濾發生b.Score >= 20。所以最終的結果將是

ID Name Score 
2 Over 20 
3 Flow 30