我有一个问题。我想知道何时多次运行子查询以获得相同的值,然后子查询是否每次都执行。
例如:我有这个查询:
SELECT [, columns]
FROM SomeTable
WHERE id >= (SELECT MAX(SomeTableId) FROM OtherTable)
子查询是否执行几次?
答案 0 :(得分:3)
这取决于。对于您的示例,SQL Server足够聪明,只可以运行一次查询。这是一种优化。
通常,此类构造会移入FROM
子句中,因此单执行更为明显:
SELECT . . .
FROM SomeTable s JOIN
(SELECT MAX(SomeTableId) as max_SomeTableId
FROM OtherTable
) o
ON s.id >= max_SomeTableId;
如果您的查询具有关联子句(通常是引用外部查询的where
或having
子句),则它 可以运行多次。
我之所以说“可以”,是因为实际的执行计划看上去与您的原始查询完全不同。 SQL是一种声明性语言,其中“查询”实际上表示结果集的外观。优化器可以选择所需的任何方法来得出声明的结果集。