2

我想在单个查询中从子表和父表中删除记录。请找到下面给出的查询。这里的响应头是主表,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')

但它的抛出错误。谁能帮我找出正确的查询

4

3 回答 3

3

除非您使用某种级联删除,否则单个删除语句将从单个表中删除行。

在您的示例中,如果语法正确,您将只删除行responseheader,其余表仅用于确定要删除的行responseheader

坦率地说,您确实不想使用级联删除,因此您应该执行多个删除语句,每个表中都有一个。

于 2010-04-23T06:14:15.243 回答
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'
于 2010-04-23T06:40:06.237 回答
0

正如 Lasse 所提到的,级联删除是使用单个查询从多个表中删除的唯一选项。为此,您应该设置外键并删除主表中的条目。子表中的行将被删除。但最好不要使用。使用多个删除语句会更好。您还可以通过将自动提交设置为 false 来使用事务。然后删除行并根据需要手动提交或回滚。

于 2010-04-23T06:43:07.773 回答