基于另一个表中的复合键删除

Jef*_*eff 13 sql t-sql sql-server

我一直不愿意发布这个,因为我觉得这是一个常见的问题,但我似乎无法找到适用于这种情况的答案......(也许我只是一个非常糟糕的Google员工).

我有两个相同的表(列方式,而不是数据),table1和table2.我希望删除table1中的记录,其中两个表中都存在复合键(col1,col2).这就是我所拥有的,这似乎对我来说是正确的,但却是一个错误.

DELETE FROM Table1
WHERE (**Col1**, Col2) IN
(SELECT Col1, Col2
FROM Table1 a
JOIN Table2 b
    ON a.Col1 = b.Col1
    AND a.Col2 = b.Col2)
Run Code Online (Sandbox Code Playgroud)

错误:

消息4145,级别15,状态1,行212在期望条件的上下文中指定的非布尔类型的表达式,在','附近.

我把两个*代码部分放在了"Red error squiggles"的旁边.

Mic*_*son 21

这可以使用JOIN您的DELETE:干净地执行:

DELETE a
FROM 
    Table1 a 
    JOIN Table2 b
        ON a.Col1 = b.Col1
        AND a.Col2 = b.Col2
Run Code Online (Sandbox Code Playgroud)

  • @Jeff 对 Oracle 有效,但对 Sql Server 无效...它们使用的 Sql 方言略有不同,并不总是可以互换。 (2认同)

小智 8

它是哪个DBMS?如果是口语,那么成对比较应该有效.

DELETE FROM Table1
WHERE (Col1, Col2) IN
(SELECT Col1, Col2
 FROM Table2)
Run Code Online (Sandbox Code Playgroud)

如果它是SQL服务器,那么Michael的解决方案应该可行.