如何进行删除查询?

时间:2013-09-06 08:18:12

标签: mysql sql hibernate

假设我有以下数据库表结构:

A> - B - < C> - D

其中> - 是多对一关系并且 - <一个对多

现在我想删除所有与具有给定名称的D对应的A条目。

有人可能会说

DELETE FROM A JOIN B ON <condition> JOIN C ON <condition> JOIN D ON <condition> WHERE D.name=?

将是一个解决方案。遗憾的是,您似乎在JOIN查询中没有DELETE子句。

另一种方法是使用子查询,如下所示:

DELETE FROM A AS elem WHERE elem.id IN ( SELECT id FROM A JOIN B ON <condition> JOIN C ON <condition> JOIN D ON <condition> WHERE D.name=?);

虽然这可能在Oracle中有效,但MySQL不允许我这样做(我不能在我要删除的表格上做出选择)。

那我该怎么做呢?

更确切地说,我正在使用Hibernate并且它是HQL来创建此查询。因此,首选JPA / Hibernate解决方案。

当然,简单的SQL也会这样做(我会尝试将其翻译成HQL)。

1 个答案:

答案 0 :(得分:3)

是的,您可以使用联接删除。 MySQL文档中描述了语法: DELETE

DELETE A                     -- you only need to add `A` here, so it knows
                             -- which table to delete from
FROM A 
  JOIN B ON <condition> 
  JOIN C ON <condition> 
  JOIN D ON <condition> 
WHERE D.name = ? ;

子查询方法也可行。如果用于执行A join B的条件为ON A.xid = B.xid,则您可以使用:

DELETE FROM A 
WHERE A.xid IN 
      ( SELECT B.xid 
        FROM B 
          JOIN C ON <condition> 
          JOIN D ON <condition> 
        WHERE D.name = ?
      ) ;

但我会用它。 IN的子查询有时效果不佳。


另一种方法是相关的EXISTS子查询:

DELETE FROM A 
WHERE EXISTS 
      ( SELECT 1  
        FROM B 
          JOIN C ON <condition> 
          JOIN D ON <condition> 
        WHERE D.name = ?
          AND A.xid = B.xid       -- the condition for "A JOIN B"
      ) ;