【问题标题】:Changing IN to EXISTS in SQL在 SQL 中将 IN 更改为 EXISTS
【发布时间】:2019-09-13 03:33:15
【问题描述】:

我有以下疑问:

select A,
       B 
  from table1 
 where A in (select c 
               from table 2
            )

但是,现在我需要更改此查询并使用exists 而不是in,它应该给出相同的结果。

我的表格如下所示:

table1            table2
A    B               c
------             -----
1    x               1
2    y               3
3    z               4
4    w               7
5    a
1    b

如何使用exists 函数?

【问题讨论】:

  • 这看起来像 Oracle.. 但是请说明您使用的是哪个 DBMS!

标签: sql


【解决方案1】:

您需要将exists 中将使用的两列匹配在一起:

select
    t1.a, t1.b
from
    table1 t1
where
    exists (select 1 from table2 t2 where t2.c = t1.a)

之所以必须这样做,是因为exists 对表进行了半联接,因此需要有联接条件。

【讨论】:

    【解决方案2】:

    换个表达方式:

    FROM Table1 WHERE a IN( SELECT c FROM Table2 )
    

    EXISTS 是一个简单的问题:

    1. 在内部SELECT末尾添加WHERE

      FROM Table1 WHERE a IN( SELECT c FROM Table2 WHERE )
      
    2. 将外部匹配列 (a) 移动到内部 SELECTWHERE 子句中

      FROM Table1 WHERE  IN( SELECT c FROM Table2 WHERE a )
      
    3. 将内部匹配列 (c) 移动到 WHERE 子句,留下一个列占位符(常量或 *):

      FROM Table1 WHERE  IN( SELECT * FROM Table2 WHERE a = c )
      
    4. IN 更改为EXISTS

      FROM Table1 WHERE EXISTS( SELECT * FROM Table2 WHERE a = c )
      
    5. 为安全起见,将表名添加到外部列:

      FROM Table1 WHERE EXISTS( SELECT * FROM Table2 WHERE Table1.a = c )
      

    【讨论】:

      【解决方案3】:

      这将通过直接内部连接来完成。

       select 
          t1.a, t1.b
       from 
          table1 as t1 
             inner join table2 as t2 on t1.a=t2.c 
      

      【讨论】:

      • 有时会更快,有时则不然。如果table2 明显小于table1,则执行exists 通常要快得多。获取最终结果的执行计划。
      • @Eric:如果使用“智能”sql server,它将按计划行事,但如果 sql 优化受到限制(例如在 sqlite 上),则更有可能简单地转向优化如果存在 IN、OR、EXISTS 等,则关闭。Prabic 没有标记他正在使用的特定服务器。
      猜你喜欢
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 2013-05-08
      • 2010-09-06
      • 2021-10-22
      • 2013-11-18
      • 2018-12-22
      相关资源
      最近更新 更多