1

当 Exists 前面有子查询的 Select 部分时,您在其中放入了什么?

Select *  
  From some_table  
 Where Exists (Select 1  
                From some_other_table  
               Where some_condition )

我通常使用 1,我曾经放 * 但意识到它可能会增加一些无用的开销。你放什么?有没有比放置 1 或任何其他虚拟值更有效的方法?

4

3 回答 3

1

我也使用 1。我见过一些使用 null 的开发人员。我认为 1 与从任何字段中选择相比是有效的,因为查询在执行子查询的 select 子句时不必从物理位置获取实际值。

于 2009-10-06T17:16:43.077 回答
1

我认为效率取决于您的平台。在 Oracle 中,EXISTS 子句中的 SELECT * 和 SELECT 1 生成相同的解释计划,具有相同的内存成本。没有区别。但是,其他平台可能会有所不同。

作为个人喜好,我使用

  SELECT *

因为选择特定字段可能会误导读者认为我关心该特定字段,并且它还允许我复制/粘贴该子查询并在未修改的情况下运行它,以查看输出。

但是,SQL 语句中的 EXISTS 子句有点代码味道,IMO。有时它们是获得所需内容的最佳和最清晰的方式,但它们几乎总是可以表示为连接,这对于数据库引擎来说更容易优化。

SELECT *
FROM SOME_TABLE ST
WHERE EXISTS(
  SELECT 1
  FROM SOME_OTHER_TABLE SOT
  WHERE SOT.KEY_VALUE1 = ST.KEY_VALUE1
    AND SOT.KEY_VALUE2 = ST.KEY_VALUE2
  ) 

逻辑上等同于:

SELECT *
FROM
  SOME_TABLE ST
  INNER JOIN
  SOME_OTHER_TABLE SOT
  ON ST.KEY_VALUE1 = SOT.KEY_VALUE1
    AND ST.KEY_VALUE2 = SOT.KEY_VALUE2
于 2009-10-06T17:16:50.640 回答
1

采用:

WHERE EXISTS (SELECT NULL
                FROM some_other_table  
               WHERE ... )

如果一个或多个指定条件匹配,则 EXISTS 返回 true - 列是否在 SELECT 子句中实际返回并不重要。NULL 只是明确表示没有比较,而 1/etc 可能是以前在 IN 子句中使用的有效值。

于 2009-10-06T17:28:13.050 回答