请看下面关于左外连接的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服务器在后台运行的确切程度如何?
干杯
答案 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
语句以减少结果。