2010-04-23 44 views
2

我想从单个查询中删除子表以及父表中的记录。请找到下面给出的查询。这里响应头是主表,responseid是主键。使用sqlserver2005中的单个查询一次删除多个表中的记录

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

始终发布尽可能多的信息,因为你有。例如,“抛出错误”?请发布您收到的错误消息。如果错误消息“Table responseheader不存在”,我们可以做的不多,所以我们真的需要看看数据库引擎抱怨什么。 – 2010-04-23 06:12:51

回答

3

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

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

要钝了,你真的不想使用级联删除,所以你应该执行多个删除语句,每个表中的一个。

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' 
0

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

相关问题