2010-03-09 62 views
1

我想这样做:如何删除相互引用的表中的行?

delete from table1 a,table2 b, table3 c 
where a.col1 = b.col1 
    and b.col2 = c.col2 
    and a.co3 <> 8001; 

但它给我的错误。

+0

什么是错误(以及你想要发生什么) – Mark 2010-03-09 15:36:15

+0

模式是什么样的?哪些表具有外键? – Thomas 2010-03-09 15:36:44

+0

a.col1主键 b.col1 forien键,主键 c.col2 foriend关键 – SmartestVEGA 2010-03-09 15:38:25

回答

3

先删除的最低水平,并从那里向上移动,一个每一级删除,为最高级别:

DELETE FROM ChildTable WHERE ParentID=... 

DELECT FROM ParentTable WHERE ParentID=... 
+0

+1:SQL Server不支持多表删除 – 2010-03-09 15:40:24

+0

实际上,您可以使用thekaido提到的级联函数来实现此功能 – super9 2010-03-09 15:45:47

1

既然你没有指定什么每个表都有一个外键和在其领域,我会猜测:

Delete TableC 
Where Exists(Select 1 From TableA Where TableA.Col1 = TableC.Col2 And TableA.Col3 <> '8001') 

Delete TableB 
Where Exists(Select 1 From TableA Where TableA.Col1 = TableB.Col2 And TableA.Col3 <> '8001') 

Delete TableA 
Where Col3 <> '8001' 
2

您可以打开级联删除,然后删除父记录。

+0

+1这实际上是最好的答案。 – JonH 2010-03-09 15:45:16

+0

+1我要写完全相同的答案。这是删除相关记录的唯一自动化方式。其他选项在第一个答案中描述。 – mevdiven 2010-03-09 15:48:48

+1

明确是最好的答案。如果有人不情愿地触发它,“CASCADE ON DELETE”会导致问题,并且可以应用SQL Server 2005“CASCADE ON DELETE”,但在自引用关系时不起作用。 – 2010-03-09 15:49:37

0

从表1一个删除A,表2 B,表3Ç
其中a.col1 = b.col1
和b.col2 = c.col2
和a.co3 <> 8001;