在 WHERE EXIST 子句中我必须 SELECT 做什么?

What do I have to SELECT in a WHERE EXIST clause?

WHERE EXIST 子句的子查询中,我必须 SELECT 做什么?

这是一个带有 WHERE EXIST 子句的随机查询:

SELECT a.*
FROM a
WHERE EXISTS
(SELECT *
 FROM b
 WHERE  b.a_id = a.id)

因此,*b 中被 select 编辑。但这对我来说毫无意义,因为我不想 select 任何东西(除非我误解了 WHERE EXIST 的行为)。我本可以 selected 1 但这看起来也很奇怪。

我认为它在执行速度方面并不重要,任何东西都可以工作,但在可读性和 "semantics" 方面可能很重要。 (我不确定我使用的词!)。这有什么最佳实践吗?如果是这样,为什么选择一种方式而不是另一种方式?

没关系。一个好的做法是使用 SELECT 1 来指示它是一个 non-data 返回子查询。

select不计算,无所谓。在 SQL 服务器中,您可以在存在的子查询中放置一个 SELECT 1/0,它甚至不会抛出被零除的错误。

相关:What is easier to read in EXISTS subqueries? https://dba.stackexchange.com/questions/159413/exists-select-1-vs-exists-select-one-or-the-other

对于non-believers:

 DECLARE @table1 TABLE (id INT)
 DECLARE @table2 TABLE (id INT)

 INSERT INTO @table1
 VALUES
 (1),
 (2),
 (3),
 (4),
 (5)

 
 INSERT INTO @table2
 VALUES
 (1),
 (2),
 (3)

SELECT * 
FROM @table1 t1
WHERE EXISTS (
SELECT 1/0
FROM @table2 t2
WHERE t1.id = t2.id)

* 表示法甚至适用于没有任何列的 table 。 ( * 并不比 1 更昂贵;解析器知道不需要子查询的结果,类似于 COUNT(*)


CREATE TABLE none( none INTEGER ); -- ONE column
INSERT INTO none(none) SELECT 1 ; -- ONE row

ALTER  TABLE none
        DROP COLUMN none; -- NO columns!!!!

SELECT * FROM none; -- Still one row ...
SELECT COUNT(*) FROM none; -- Still one row ...

SELECT 'Yes'
WHERE EXISTS (
        SELECT *  -- even works for NO columns ...
        from none
        );