Vac*_*ano 3 sql t-sql sql-server join
我有另一个程序员写了一堆像这样的删除语句:
DELETE dbo.Test WHERE TestId IN (SELECT TestId FROM #Tests )
Run Code Online (Sandbox Code Playgroud)
(这个很简单,但在这样的语句中还有其他带有 sub 和 sub-sub 的语句)
我总是把这些类型的语句写成一个连接。在我看来,这就像有一个会被一遍又一遍调用的内嵌函数。
但是,我知道优化器能够发挥一些重要的魔力,并且一直在添加新的东西。我有一段时间没有研究 Join 和 In 之间的区别,我想我会问它是否仍然应该是一个连接。
使用“join”还是“in”有关系吗?
大多数现代 SQL 优化器会从这样的子句中找出连接,但不能保证,查询越复杂,优化器选择正确操作的可能性就越小。
一般来说,IN在这种情况下使用不是一个好习惯。(个人意见警告)它真的不应该这样使用。
一个好的经验法则(同样,这是有争议的,但没有错)是,对于使用IN,坚持有限列表。例如:
SELECT DISTINCT * FROM foo WHERE id IN (1, 2, 3, ...);
Run Code Online (Sandbox Code Playgroud)
当反对另一张桌子时,以下之一是可取的:
SELECT DISTINCT f.* FROM foo AS f
INNER JOIN bar as b on b.foo_id = f.id;
SELECT DISTINCT * FROM foo AS f
WHERE EXISTS (SELECT NULL FROM bar AS b WHERE b.foo_id = f.id);
Run Code Online (Sandbox Code Playgroud)
根据您正在做什么以及您的数据的性质,您的里程会因这些而有所不同。
注意,在这个简单的例子,IN中,JOIN和EXISTS很可能会产生完全相同的查询计划。然而,当您开始研究针对多个表的一些严肃的业务逻辑时,您可能会发现查询计划明显不同。