当 Exists 前面有子查询的 Select 部分时,您在其中放入了什么?
Select *
From some_table
Where Exists (Select 1
From some_other_table
Where some_condition )
我通常使用 1,我曾经放 * 但意识到它可能会增加一些无用的开销。你放什么?有没有比放置 1 或任何其他虚拟值更有效的方法?
我也使用 1。我见过一些使用 null 的开发人员。我认为 1 与从任何字段中选择相比是有效的,因为查询在执行子查询的 select 子句时不必从物理位置获取实际值。
我认为效率取决于您的平台。在 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
采用:
WHERE EXISTS (SELECT NULL
FROM some_other_table
WHERE ... )
如果一个或多个指定条件匹配,则 EXISTS 返回 true - 列是否在 SELECT 子句中实际返回并不重要。NULL 只是明确表示没有比较,而 1/etc 可能是以前在 IN 子句中使用的有效值。