使用INNER JOIN从2个表中删除

时间:2016-05-05 12:28:53

标签: sql sql-server sql-delete

我有3张桌子。

  • InvoiceOriginal
  • 发票
  • InvoiceHistory

发票表具有外键约束。 发票表中的每个条目在Invoiceoriginal中都有相应的条目。

invoiceOriginal表存储发票的原始值,发票表存储用户已修改的值。 这样做是为了在提交时得到不同之处。

我正在使用的SQL是

DELETE i
FROM invoice i
INNER JOIN InvoiceHistory aih
   ON i.ClientId = aih.HistoryClientNumber
   AND i.invoiceNumber = HistoryInvoiceNumber

但是由于外键约束而无法删除。

表格如下:

Invoice         InvoiceOriginal         InvoiceHistory
 Id                FK_InvoiceId            ClientId
 ClientId          ClientId                InvoiceNumber
 InvoiceNumber

一旦在同一clientId的InvoiceHistory中有该发票编号的条目,我需要删除发票和InvoiceOriginal中的条目。

4 个答案:

答案 0 :(得分:6)

您不能一次针对多个表发出删除语句,在删除父记录之前,您需要为每个相关表创建单独的删除语句

答案 1 :(得分:3)

我很确定你不能用一个语句从多​​个表中删除。我通常会先用一个语句删除子行,然后删除父记录。如果您可能需要在失败时回滚,您可能希望在事务内执行此操作。

或者,您可以在外键上启用CASCADE ON DELETE,如果这是适合此系统的内容,则会通过子记录自动级联删除。

答案 2 :(得分:1)

您无法从单个查询中删除多个表中的记录。但是你有两种方法可以解决这个问题

  1. 从子表或映射表中删除所有相关记录,然后 删除父/标头表记录。 (此处需要多个查询。使用SQL Transaction进行更好的控制)。

  2. 或者,将您的外键约束修改为ON DELETE CASCADE

答案 3 :(得分:-1)

是的,您可以,我现在做到了:

DELETE T1,T2 FROM T1
        INNER JOIN
    T2 ON T2.FIELD = T1.FIELD
WHERE
    T1.SOMETHING='SOMETHING'