SQL "in" vs Join for delete

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”有关系吗?

Jer*_*acs 5

大多数现代 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很可能会产生完全相同的查询计划。然而,当您开始研究针对多个表的一些严肃的业务逻辑时,您可能会发现查询计划明显不同。