在一个查询中使用左联接从多个表中删除

时间:2018-11-23 11:53:26

标签: sql sql-server tsql

我想知道是否可以执行以下操作,我有3个表要从中删除数据:Table1,Table2,Table3

Table1中始终有一条记录,Table2Table3中可能有或没有相关记录。

所以我想我可以做以下事情:

DELETE FROM dbo.Table1, dbo.Table2, dbo.Table3
FROM Table1 t1
LEFT JOIN dbo.Table2 t2 ON t1.Id = t2.Id
LEFT JOIN dbo.Table3 t3 ON t3.Id = t1.Id
WHERE t1.Id = @Id;

但是由于Incorrect syntax near ','.行,我得到了DELETE FROM dbo.Table1, dbo.Table2, dbo.Table3

理想的结果是使用Where子句删除3个表中的所有数据。

我不确定如何完成此操作。

5 个答案:

答案 0 :(得分:4)

您一次只能从一个表中删除。想必您需要级联约束:

alter table2 add constraint fk_table2_table1
    foreign key (id) references table1(id)
    on delete cascade;

alter tablee add constraint fk_tablee_table1
    foreign key (id) references table1(id)
    on delete cascade;

外键可确保数据完整性。级联约束意味着当删除主键时,其他表中的相应行也将被删除。

答案 1 :(得分:2)

对此有两种方法。就个人而言,我建议在触发条件上使用SP;像其他人一样,我也不是触发器的忠实拥护者,因为它们通常是一个“隐藏”的实体(很多时候我一直无法弄清为什么某个东西无法找到它是我不是的触发器知道)。

无论如何,触发方法将是:

initialDeposit += contribution

但是,由于您使用的是单个值,因此参数化存储过程会更好。然后让var monthCount = Math.ceil((targetSaving - initialDeposit)/contribution); 个用户在表上运行CREATE TRIGGER Cascade_Table2_Table3 ON dbo.Table1 AFTER DELETE AS DELETE T2 FROM Table2 T2 JOIN deleted d ON t2.Id = d.Id; DELETE T3 FROM Table3 T3 JOIN deleted d ON t3.Id = d.Id; GO

DENY

答案 2 :(得分:1)

您可以在table1上使用触发器吗?因此,您只能从table1中删除记录,然后让触发器从table2和table3中删除内容。

类似的东西:

CREATE TRIGGER [dbo].[T_deleteT2_t3]
    ON [dbo].[Table1]
    AFTER  DELETE
AS

BEGIN

    delete from table2 where id = select id from deleted
    delete from table3 where id = select id from deleted

END

答案 3 :(得分:1)

这是使用 OUTPUT 子句

的另一种方式
CREATE TABLE T1( ID INT);
CREATE TABLE T2( ID INT);
CREATE TABLE T3( ID INT);

INSERT INTO T1 VALUES (1), (2);
INSERT INTO T2 VALUES (1), (3);
INSERT INTO T3 VALUES (1), (4);

BEGIN TRAN;

 DECLARE @Out TABLE (IDs INT);

 DELETE T1
 OUTPUT DELETED.ID INTO @Out
 FROM T1 INNER JOIN T2 ON T1.ID = T2.ID;

 DELETE T2
 FROM T2 INNER JOIN @Out O ON T2.ID = O.IDs;

 DELETE T3
 FROM T3 INNER JOIN @Out O ON T3.ID = O.IDs;

COMMIT TRAN;

SELECT *
FROM T1;
SELECT *
FROM T2;
SELECT *
FROM T3;

Demo

答案 4 :(得分:0)

**DELETE t1,t2,t3 FROM**
FROM Table1 t1
LEFT JOIN dbo.Table2 t2 ON t1.Id = t2.Id
LEFT JOIN dbo.Table3 t3 ON t3.Id = t1.Id
WHERE t1.Id = @Id;