2012-11-19 38 views
11

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

我有两个相同的表(逐列,而不是数据),Table 1和Table。我希望删除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 An expression of non-boolean type specified in a context where a condition is expected, near ','.

我已经放了两个*其中有 '红色错误的波浪线' 的代码部分的周围。

+0

我相信这是SQL-SERVER? – gdoron

+0

是的,对不起。应该更具体。在这里,我们只是将SQL-SERVER称为SQL,将Oracle称为Oracle。 – Jeff

+0

因为Oracle比sql-server要“老”许多,但是......如果它让你的老板开心,并且你更富有,为什么不呢? – gdoron

回答

18

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

DELETE a 
FROM 
    Table1 a 
    JOIN Table2 b 
     ON a.Col1 = b.Col1 
     AND a.Col2 = b.Col2 
+0

该解决方案有效,但我希望你能解释为什么我的不工作。我已经看到使用'(col1,col2)'语法的类似问题的解决方案。 – Jeff

+0

@Jeff适用于Oracle,但不适用于Sql Server ...它们使用略有不同的Sql方言,并不总是可以互换的。 –

+0

这是有道理的。我可以发誓我在某个时候在SQL-Server中使用了这种语法,但我可能是错误的。尝试在SQL-Server,MySQL和Oracle之间保持语法是一团糟。谢谢! – Jeff

7

哪个DBMS是什么呢?如果是在口头上,那么配对比较应该是有效的。

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

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

+0

这也适用于HSQLDB:'从table1中删除where(col1,col2,col3)in(选择col1,col2,col3 from someview123 where ...)' – binwiederhier

相关问题