删除相关行的过程

Posted

技术标签:

【中文标题】删除相关行的过程【英文标题】:Procedure deleting related rows 【发布时间】:2017-05-10 08:05:53 【问题描述】:

我想实现从 3 个相关表中删除行的过程。

我有桌子、A、B 和 C。

Table A
ID

Table B
ID
tableAId

Table C
ID
tablceBId

关系表 A - B 是一对多,关系 B - C 是一对多。

现在我想实现一个过程,该过程将删除与表 A 相关的所有行。我不想在级联上进行这些删除。我可以在一个查询中实现这一点吗?

我在表 A 中传递行 ID。

【问题讨论】:

【参考方案1】:
CREATE PROCEDURE delTableA
@tableA_ID int
AS
BEGIN
    DELETE C
    FROM C
    INNER JOIN B ON C.ID = B.tableCId
    INNER JOIN A ON B.ID = A.tableBId
    WHERE A.ID = @tableA_ID

    DELETE B
    FROM B
    INNER JOIN A ON B.ID = A.tableBId 
    WHERE A.ID = @tableA_ID

    DELETE FROM A
    WHERE A.ID = @tableA_ID
END
GO

如,

CREATE TABLE C (ID int)
CREATE TABLE B (ID int, tableCId int)
CREATE TABLE A (ID int, tableBId int)
GO
INSERT INTO c VALUES (1)
INSERT INTO b VALUES (1, 1)
INSERT INTO a VALUES (1, 1) 
GO

CREATE PROCEDURE delTableA
@tableA_ID int
AS
BEGIN
    DELETE C
    FROM C
    INNER JOIN B ON C.ID = B.tableCId
    INNER JOIN A ON B.ID = A.tableBId
    WHERE A.ID = @tableA_ID

    DELETE B
    FROM B
    INNER JOIN A ON B.ID = A.tableBId 
    WHERE A.ID = @tableA_ID

    DELETE FROM A
    WHERE A.ID = @tableA_ID
END
GO
EXEC delTableA 1
GO

如果你运行这个查询,所有的都是空的:

select * from A
select * from B
select * from C

【讨论】:

以上是关于删除相关行的过程的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL中自动删除7天以上行的存储过程

sqlserver利用存储过程去除重复行的sql语句

测试过程中常用的linux命令之删除指定的文件行

sql server 删除表及表的相关视图存储过程方法

jQuery实现表格行的动态增加与删除(改进版)

oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)