我在WHERE EXIST子句中有什么选择?

时间:2018-03-30 14:58:48

标签: sql postgresql postgresql-9.6

SELECT子句的子查询中我对WHERE EXIST有什么要求?

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

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

因此,*中选择了b。但这对我没有意义,因为我不想选择任何东西(除非我误解了WHERE EXIST的行为)。我本来可以选择1,但这看起来很奇怪。

我认为这在执行速度方面并不重要,任何事情都可行,但它在可读性和语义方面可能很重要"。 (我不确定我用过的词!)。这有什么最好的做法吗?如果是这样,为什么选择一种方式而不是另一种方式?

2 个答案:

答案 0 :(得分:8)

没关系。一个好的做法是使用SELECT 1来表明它是一个非数据返回子查询。我还听说传递1使用较少的字节到引擎,因为1有点而*不是。

选择未评估且无关紧要。在SQL Server中,您可以在存在的子查询中放置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

对于非信徒:

 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)

答案 1 :(得分:1)

*表示法甚至适用于没有任何列的表 。 (*并不比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
        );