如何从值中删除子表?

时间:2015-06-07 21:56:54

标签: sql

我有一个TableA,其中2个SmallTableA与TableA相关联。他们都有TableA的外键 所以,如果我的表A是:

TableA
------
idA
Name

我的ChildTables是:

ChildTableA
-----------
IdChildTable
numA
name

我想从我的2个SmallTableA中删除与TableA where TableA.name = @name中的行对应的所有记录。

我试过这种方式:

DELETE FROM ChildTableA1
WHERE EXISTS
      (SELECT ChildTableA1.*
          FROM ChildTableA1 INNER JOIN TableA ON ChildTableA.numA = TableA.idA
          WHERE (TableA.name = @name))

问题是它从ChildTable1中删除了所有行,就像我这样做:

Delete * from ChildTableA1.

有没有办法一次性从ChildTableA1和ChildTableA2中删除,但仅限于符合条件的行?

1 个答案:

答案 0 :(得分:0)

您的DELETE确实会删除所有内容,因为查询意味着"删除此表中的行(如果存在)"并且由于EXISTS为真,所有行都将被删除。您需要将WHERE条件赋予实际的DELETE

DELETE FROM ChildTableA1
  WHERE numA IN (SELECT idA FROM TableA
    WHERE TableA.name = @name);

这样,每行都会检查TableA中的匹配行。

如果要一次从两个表中删除,则不可能,除非它们之间有外键并且为约束设置了CASCADE DELETE。如果链接表存在CASCADE DELETE,只需执行

DELETE FROM TableA WHERE name = @name;

也会导致删除其他表中的引用行。