嵌套查询与jOINs

Raw*_*hi 7 t-sql sql-server

如果我使用的话nestted subquery,whos可能效率很高,JOINs 或者可能temp tables......另一个问题:在子查询中,如果我使用相同的查询两次IN子句,它应该执行两次!像这样 :

Select ...
From X 
Where Exists( Select 1  From Y Where Idx = Y.SomeColumn ) 
Or Exists( Select 1 From Y Idy = Y.SomeColumn )
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM Y在此查询中可以执行子查询的次数!
如果我用这种方式这样做会怎么样:

With XX As
(
Select ...
From Y
)
Select ...
From X
Where Exists ( Select 1 From XX Where Idx = XX.SomeColumn )
Or Exists ( Select 1 From XX Where Idy = XX.SomeColumn )
Run Code Online (Sandbox Code Playgroud)

thanx :)

OMG*_*ies 4

这两个查询是等效的,并且应该产生相同的计划。认为 CTE 仅编译一次即可提供性能优势的观点是错误的。非递归 CTE 只是派生表/内联视图的语法糖(IMO 错误地称为子查询)。

其次,JOIN 与 IN/EXISTS 可以产生不同的结果。如果有两个或更多支持记录,则 JOIN 存在重复数据的风险。如果存在重复的条件,最好使用 EXISTS,因为它在第一次遇到条件时返回 true - 使其可能比 IN 或 JOIN 更快。使用 EXISTS 或 IN 时不存在数据重复风险。