代码之家  ›  专栏  ›  技术社区  ›  rap-2-h

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

  •  5
  • rap-2-h  · 技术社区  · 6 年前

    我该怎么办 SELECT 在a的子查询中 WHERE EXIST 条款

    下面是一个随机查询 存在的位置 条款:

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

    所以 * 在中选择 b 。但这对我来说毫无意义,因为我不想选择任何东西(除非我误解了 存在的位置 )。我本可以选择 1 但这似乎也很奇怪。

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

    2 回复  |  直到 6 年前
        1
  •  9
  •   dfundako    4 年前

    没关系。一个好的做法是 SELECT 1 指示它是非数据返回子查询。

    选择不进行评估,也无所谓。在SQL Server中,可以将 SELECT 1/0 在exists子查询中,它甚至不会抛出被零除的错误。

    相关: 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)
    
        2
  •  1
  •   joop    6 年前

    这个 * 符号甚至适用于表 没有任何列 。 ( * 不比 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
            );