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

rap*_*2-h 4 sql postgresql postgresql-9.6

SELECTWHERE EXIST子句的子查询中我有什么?

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

SELECT a.*
FROM a
WHERE EXISTS
(SELECT *
 FROM b
 WHERE  b.a_id = a.id)
Run Code Online (Sandbox Code Playgroud)

所以,*被选中了b.但这对我没有意义,因为我不想选择任何东西(除非我误解了它的行为WHERE EXIST).我可以选择,1但这似乎也很奇怪.

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

dfu*_*ako 8

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

选择未评估且无关紧要.在SQL Server中,您可以SELECT 1/0在存在的子查询中放置一个,它甚至不会抛出除以零的错误.

相关:EXISTS子查询中哪些更容易阅读? 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)
Run Code Online (Sandbox Code Playgroud)

  • @ rap-2-h 1/0很有趣,在QA/Code Review期间真的让人失望.看着他们浪费时间试图理解为什么它没有错误. (3认同)
  • @ Hosch250 EXISTS中的选择不评估.选择外面做. (2认同)