首页 > 解决方案 > 如何删除多个列 IN\NOT IN 其他表?

问题描述

我有一个目标表和一个源表

并且只有当某些列的数据出现在另一个表(源表)中时,我才想从中删除一行

例如:

要从中删除的目标表:

|  Delivery  |   Order     |     Row      |  OtherColumn |
|:----------:|:-----------:|:------------:|:------------:|
|     1      |     A       |    000010    |     asaf     |
|     1      |     A       |    000020    |     ag       |
|     2      |     C       |    000010    |     DEL      |<-I WANT TO DELETE THIS ROW
|     2      |     D       |    000020    |     hhs      |  
|     3      |     E       |    000040    |     ba       |
|     3      |     E       |    000170    |     ass      |

源表,在这里我有一行我想保留在目标表中:

|  Delivery  |   Order     |     Row      |
|:----------:|:-----------:|:------------:|
|     2      |     D       |    000020    | 

我正在寻找目标表的结果是:

|  Delivery  |   Order     |     Row      |  OtherColumn |
|:----------:|:-----------:|:------------:|:------------:|
|     1      |     A       |    000010    |     asaf     |
|     1      |     A       |    000020    |     ag       |
|     2      |     D       |    000020    |     hhs      |  
|     3      |     E       |    000040    |     ba       |
|     3      |     E       |    000170    |     ass      |

这意味着,如果交付编号 2 的所有行不在源表中,它们将被删除

我将 Delivery 参数设置为 @Delivery

我尝试的是:

delete from Target 
where Delivery = @Delivery
and ([Delivery],[Order],[Row]) not in (select [Delivery],[Order],[Row] 
                                 from Source)

但是有一个语法错误,我知道在 NOT IN 运算符中不能接受多列,

我能做些什么?

标签: sqlsql-server

解决方案


尝试使用不存在:

delete from Target 
from Target target
where Delivery = @Delivery
and NOT EXISTS (select 1 from Source s where s.[Delivery] = target.Delivery and 
    s.[Order] = target.[Order] and s.[Row] = target.[Row] )

推荐阅读