SELECT
子句的子查询中我对WHERE EXIST
有什么要求?
这是一个带有WHERE EXIST
子句的随机查询:
SELECT a.*
FROM a
WHERE EXISTS
(SELECT *
FROM b
WHERE b.a_id = a.id)
因此,*
中选择了b
。但这对我没有意义,因为我不想选择任何东西(除非我误解了WHERE EXIST
的行为)。我本来可以选择1
,但这看起来很奇怪。
我认为这在执行速度方面并不重要,任何事情都可行,但它在可读性和语义方面可能很重要"。 (我不确定我用过的词!)。这有什么最好的做法吗?如果是这样,为什么选择一种方式而不是另一种方式?
答案 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
);