代码之家  ›  专栏  ›  技术社区  ›  Derek Adair

从表中删除数据,通过两个表连接

  •  10
  • Derek Adair  · 技术社区  · 15 年前

    我正在处理一些相当敏感的数据,所以我要绝对确定我做的是正确的。

    我正在尝试删除与另一个表关联的表中的行

    将表关联的唯一方法是通过其他两个表进行联接…

    以下是确切的查询:

    DELETE tt.Transaction_Amount, tt.Transaction_ID
      FROM ItemTracker_dbo.Transaction_Type tt
      JOIN ItemTracker_dbo.Transaction t ON tt.Transaction_ID = t.Transaction_ID
      JOIN ItemTracker_dbo.Purchase p ON p.Transaction_ID = tt.Transaction_ID
      JOIN ItemTracker_dbo.Item i ON i.Item_ID = p.Item_ID
     WHERE i.Client_ID = 1
    

    如你所见,它不漂亮。

    不过,我通过MySQL查询浏览器得到了一个奇怪的错误…

    多重删除中的“交易金额”未知表

    我试过阅读MySQL手册,这似乎对我有用…有人知道吗?

    4 回复  |  直到 9 年前
        1
  •  23
  •   David M    15 年前

    您需要从中删除行 tt ,不是单个列:

    DELETE tt
      FROM ItemTracker_dbo.Transaction_Type tt
      JOIN ItemTracker_dbo.Transaction t ON tt.Transaction_ID = t.Transaction_ID
      JOIN ItemTracker_dbo.Purchase p ON p.Transaction_ID = tt.Transaction_ID
      JOIN ItemTracker_dbo.Item i ON i.Item_ID = p.Item_ID
     WHERE i.Client_ID = 1
    
        2
  •  1
  •   OMG Ponies    15 年前

    语法不正确-您 don't reference columns 之间 DELETE FROM . 用途:

    DELETE FROM ItemTracker_dbo.Transaction_Type tt
      JOIN ItemTracker_dbo.Transaction t ON tt.Transaction_ID = t.Transaction_ID
      JOIN ItemTracker_dbo.Purchase p ON p.Transaction_ID = tt.Transaction_ID
      JOIN ItemTracker_dbo.Item i ON i.Item_ID = p.Item_ID
     WHERE i.Client_ID = 1
    

    为了确保您删除的是正确的内容,我同意Wallyk的观点,您应该检查select语句的输出,返回的内容是您要在之前删除的内容。否则,在事务中执行删除操作,以便在需要时将其回滚。

        3
  •  0
  •   wallyk    15 年前

    您应该首先将其组成为一个查询,以返回感兴趣的行。完成调试后,将其转换为删除。

        4
  •  0
  •   Amit Gajjar    12 年前

    检查select查询,然后在对关键数据执行delete查询之前,获取该表的备份。这么简单,如果出了什么问题,你至少可以备份。