15

我真的不愿意发布这个,因为我觉得这是一个常见问题,但我似乎找不到适用于这种情况的答案......(也许我只是一个非常糟糕的谷歌用户)。

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

错误:

消息 4145,级别 15,状态 1,第 212 行 在预期条件的上下文中指定的非布尔类型表达式,靠近“,”。

我在*具有“红色错误曲线”的代码部分周围放置了两个。

4

3 回答 3

23

这可以使用JOIN您的DELETE:

DELETE a
FROM 
    Table1 a 
    JOIN Table2 b
        ON a.Col1 = b.Col1
        AND a.Col2 = b.Col2
于 2012-11-19T23:09:26.377 回答
10

它是哪个 DBMS?如果它是在口头上,那么成对比较应该可以工作。

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

如果它是 SQL 服务器,那么迈克尔的解决方案应该可以工作。

于 2012-11-19T23:14:55.527 回答
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))
于 2021-01-18T19:09:32.043 回答