尝试在不存在时删除不起作用。主键中有多列

时间:2013-11-06 02:34:01

标签: sql sql-delete exists not-exists

我目前正在尝试从表A中删除表B中未使用相应记录的情况。表A包含Section,SubSection,Code,Text作为字段,其中前三个是主键。表B将ID,Section,SubSection,Code作为字段,其中所有四个都是主键。有更多的列,但它们与这个问题无关...只是想在我被问及为什么所有列都是表B的主键的一部分之前指出它。很多表A是所有可能数据的存储库可以分配给实体,表B是它们被分配的位置。我想删除表A中未在表B中使用的所有记录。我尝试了以下但没有成功:

DELETE FROM Table A 
WHERE NOT EXISTS (SELECT * from Table B 
WHERE A.section = B.section
AND A.subsection = B.subsection
AND A.code = b.code)

如果我选择Select而不是删除,我会得到我要查找的子集,但是当我执行删除时,我得到一个错误,表示表A中存在语法错误。我会使用NOT IN声明,但多列是主键的一部分,我只是看不出它是如何工作的。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:7)

在sql server中,当使用not exists时,需要为要连接的表设置别名,并在delete语句中指定要从中删除行的表。

DELETE a FROM Table_A a 
WHERE NOT EXISTS (SELECT * from Table_B b 
WHERE a.section = b.section
AND a.subsection = b.subsection
AND a.code = b.code)

答案 1 :(得分:5)

请尝试:

DELETE FROM Table A 
WHERE NOT EXISTS (SELECT 1 from Table B 
WHERE A.section = B.section
AND A.subsection = B.subsection
AND A.code = b.code)

1只是一个占位符,任何常量/单个非空列都可以工作。

答案 2 :(得分:1)

尝试这样的事情:

delete from Table_A
    where (section, subsection, code) not in (select section, 
                                                     subsection, 
                                                     code 
                                                from Table_B)