在 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
);
在 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
);