我想在一个查询中删除子表和父表中的记录。请找到下面给出的查询。这里的响应头是主表,而responseid是主键。
DELETE FROM responseheader
FROM responseheader
INNER JOIN responsepromotion ON responseheader.responseid = responsepromotion.ResponseID
INNER JOIN responseext ON responsepromotion.ResponseID=responseext.ResponseID
WHERE responseheader.responseid In ('67D8B9E8-BAD2-42E6-BAEA-000025D56253')
但它的投掷错误。任何人都可以帮我找出正确的查询
答案 0 :(得分:3)
除非您使用某种级联删除,否则单个删除语句将从单个表中删除行。
在您的示例中,如果语法正确,您将仅从responseheader
删除行,其余表仅用于确定要从responseheader
中删除哪些行。
说实话,你确实不想使用级联删除,所以你应该执行多个删除语句,每个表一个。
答案 1 :(得分:0)
您可以创建存储过程并调用该存储过程来执行删除操作。或者您可以使用sp_executesql一次发送批处理查询,如下所示:
sp_executesql
'DELETE FROM responsepromotion
FROM responsepromotion
INNER JOIN responseheader ON responseheader.responseid = responsepromotion.ResponseID
WHERE responseheader.responseid = @guid;
DELETE FROM responseext
FROM responseext
INNER JOIN responseheader ON responsepromotion.ResponseID=responseext.ResponseID
WHERE responseheader.responseid = @guid;
DELETE FROM responseheader
WHERE responseid = @guid;',
@guid = '67D8B9E8-BAD2-42E6-BAEA-000025D56253'
答案 2 :(得分:0)
正如Lasse cascade提到的那样,删除是使用单个查询从多个表中删除的唯一选项。为此,您应设置外键并删除主表中的条目。子表中的行将被删除。但最好不要使用它。最好使用多个delete语句。您还可以通过将auto commit设置为false来使用事务。然后删除行并根据需要手动提交或回滚。