加入条件和加入子查询(过滤器)之间的区别

时间:2017-08-30 09:08:20

标签: sql-server tsql

我正在尝试理解加入条件和加入子查询之间的区别。

在SQL Server中,

CREATE TABLE #tab1
(audit_key int
,name varchar(20)
)

INSERT INTO #tab1 VALUES(1,'Rich')
INSERT INTO #tab1 VALUES(1,'Rodes')
INSERT INTO #tab1 VALUES(2,'Rich')
INSERT INTO #tab1 VALUES(2,'Rodes')
INSERT INTO #tab1 VALUES(3,'Rich')
INSERT INTO #tab1 VALUES(3,'Rodes')

SELECT a.audit_key,a.name,b.name 
FROM #tab1 a
JOIN #tab1 b ON b.name='Rodes' AND b.audit_key=2
WHERE a.name='Rich' AND a.audit_key=2

SELECT a.audit_key,a.name,b.name 
FROM #tab1 a
JOIN (SELECT audit_key,name FROM #tab1 WHERE audit_key=2 AND name='Rodes') b ON 1=1
WHERE a.name='Rich' AND a.audit_key=2

drop table #tab1

在上面的脚本中,第一个选择会发生什么? 它会先根据b.name ='Rodes'AND b.audit_key = 2过滤记录,然后用'tab1 a'记录加入吗?

1st select和2nd select有区别吗?

SQL Server如何在后台处理这两个选择?

1 个答案:

答案 0 :(得分:0)

如果查看执行计划,它们在后台处理完全相同。如果您不熟悉执行计划,请参阅以下资源:

https://www.red-gate.com/simple-talk/sql/performance/execution-plan-basics/

可能只是我,但第一个写的方式看起来很奇怪,我通常会写一些类似的东西:

SELECT a.audit_key,a.name,b.name 
FROM #tab1 a
JOIN #tab1 b ON b.name=a.name AND b.audit_key=a.audit_key
WHERE a.name='Rich' AND a.audit_key=2

因为在你的工作中,你正在加入所有东西,实际上是在制作相同的派生表,就像在连接中指定条件一样。上面的代码匹配两个,然后where指定你要查找的内容。