假设我有以下数据库表结构:
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)。
答案 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"
) ;