我正在尝试理解加入条件和加入子查询之间的区别。
在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如何在后台处理这两个选择?
答案 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指定你要查找的内容。