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 行,这与我从 where CFS_ORGANIZATION_CODE like '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不起作用?当涉及ONleft outer join?

干杯

4

2 回答 2

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

因为ScoreofT1_ID只有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
于 2013-04-02T08:45:02.070 回答
0

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

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

于 2013-04-02T08:44:40.670 回答