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

时间:2012-11-19 23:05:22

标签: sql sql-server tsql

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

我有两个相同的表(列式,不是数据),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)

错误:

  

Msg 4145,Level 15,State 1,Line 212非布尔表达式   在预期条件的上下文中指定的类型,靠近','。

我在代码部分放了两个*,其中包含“Red error squiggles”。

3 个答案:

答案 0 :(得分:21)

可以使用JOIN

使用DELETE a FROM Table1 a JOIN Table2 b ON a.Col1 = b.Col1 AND a.Col2 = b.Col2 干净地执行此操作
{{1}}

答案 1 :(得分:8)

是哪个DBMS?如果它在oracle中,则成对比较应该有效。

DELETE FROM Table1
WHERE (Col1, Col2) IN
(SELECT Col1, Col2
 FROM Table2)

如果是SQL服务器,则迈克尔的解决方案应该有效。

答案 2 :(得分:1)

没有一个答案涵盖一般情况,所以我会放我的:

您必须将字段合并为一个字段:

例如:

DELETE FROM Table1 
WHERE concat(Col1,'******',Col2) 
 IN (SELECT concat(a.Col1,'******',b.Col2) 
FROM Table1 a 
JOIN Table2 b
ON a.Col1 = b.Col1
AND a.Col2 = b.Col2))