左外连接有趣的结果

时间:2013-04-02 08:41:19

标签: sql-server

请看下面关于左外连接的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 *时的行数相同

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不起作用?当ON中的left outer join子句出现时,SQL服务器在后台运行的确切程度如何?

干杯

2 个答案:

答案 0 :(得分: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的记录首先按分数过滤。因此,将在table1上加入的唯一记录是

T1_ID   Score
2       20
3       30

因为Score的{​​{1}}只有10.查询的结果是

T1_ID

虽然第二个查询不同。

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

答案 1 :(得分:0)

不同之处在于你制作了LEFT JOIN。 因此,您可以从第一个表中获取所有行,并从第二个表中获取所有匹配的行。

在第二个查询中,您首先JOIN,然后设置WHERE语句以减少结果。