我有一个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中删除,但仅限于符合条件的行?
答案 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;
也会导致删除其他表中的引用行。