关于T-SQL中的子查询

时间:2019-05-11 07:29:36

标签: sql sql-server tsql

我有一个问题。我想知道何时多次运行子查询以获得相同的值,然后子查询是否每次都执行。

例如:我有这个查询:

SELECT [, columns] 
FROM SomeTable 
WHERE id >= (SELECT MAX(SomeTableId) FROM OtherTable)

子查询是否执行几次?

1 个答案:

答案 0 :(得分:3)

这取决于。对于您的示例,SQL Server足够聪明,只可以运行一次查询。这是一种优化。

通常,此类构造会移入FROM子句中,因此单执行更为明显:

SELECT . . . 
FROM SomeTable s JOIN
     (SELECT MAX(SomeTableId) as max_SomeTableId
      FROM OtherTable
     ) o
     ON s.id >= max_SomeTableId;

如果您的查询具有关联子句(通常是引用外部查询的wherehaving子句),则它 可以运行多次。

我之所以说“可以”,是因为实际的执行计划看上去与您的原始查询完全不同。 SQL是一种声明性语言,其中“查询”实际上表示结果集的外观。优化器可以选择所需的任何方法来得出声明的结果集。