在SQL中将IN更改为EXISTS

4 sql

我有以下查询:

select A,
       B 
  from table1 
 where A in (select c 
               from table 2
            )
Run Code Online (Sandbox Code Playgroud)

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

我的表格如下所示:

table1            table2
A    B               c
------             -----
1    x               1
2    y               3
3    z               4
4    w               7
5    a
1    b
Run Code Online (Sandbox Code Playgroud)

我该如何使用该exists功能?

Eri*_*ric 12

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

select
    t1.a, t1.b
from
    table1 t1
where
    exists (select 1 from table2 t2 where t2.c = t1.a)
Run Code Online (Sandbox Code Playgroud)

您必须这样做的原因是因为exists在表上执行半连接,因此需要具有连接条件.


RBa*_*ung 5

更改表达式:

FROM Table1 WHERE a IN( SELECT c FROM Table2 )
Run Code Online (Sandbox Code Playgroud)

一个EXISTS是一个简单的问题:

  1. WHERE在内部的末尾添加一个SELECT

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

    FROM Table1 WHERE  IN( SELECT c FROM Table2 WHERE a )
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将内部匹配列(c)移动到该WHERE子句,保留列占位符(常量或*):

    FROM Table1 WHERE  IN( SELECT * FROM Table2 WHERE a = c )
    
    Run Code Online (Sandbox Code Playgroud)
  4. 更改INEXISTS

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

    FROM Table1 WHERE EXISTS( SELECT * FROM Table2 WHERE Table1.a = c )
    
    Run Code Online (Sandbox Code Playgroud)