Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何进行删除查询?_Mysql_Sql_Hibernate - Fatal编程技术网

Mysql 如何进行删除查询?

Mysql 如何进行删除查询?,mysql,sql,hibernate,Mysql,Sql,Hibernate,假设我有以下数据库表结构: A>-B--D 其中>-是多对一关系,而-

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

A>-B--D

其中>-是多对一关系,而-<一对多关系

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

可以这样说

DELETE 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。

是的,您可以通过连接进行删除。在MySQL文档中描述了语法:

但我不会用这个。带有IN的子查询有时执行得不好

另一种方法是关联子查询:

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"
      ) ;

表示您可以使用join删除。+1表示清晰和美观explanation@AndriusNaruševičius我已经看过那篇文章了。我已经尝试在delete查询中加入一个join,但它不起作用-我被告知我的查询中有一个错误,我应该参考手册。在MySQL Workbench中,第一个连接词突出显示为错误。这可能是mysql唯一的问题。我不知道。还有其他建议吗?@DRagos您需要从加入B中删除A…,请参阅我的答案。对不起,我没有使用HQL,所以我在SQL中提供了3种方法。我希望其中一个,你能翻译成HQL。谢谢!第一个查询似乎正在运行。我曾试图找到一种翻译它的方法,但我没有成功,至少直到现在。在效率方面,你会推荐什么方法?我会先尝试连接方式。如果您在所有连接列和D.name列上都有索引,那么就可以了,但当然您必须进行测试。在A和D之间的连接中,设计的一对多,然后多对一的升降可能会使现有版本的性能更好或更差!这可能取决于表中值的分布和大小。我想说的是,测试所有版本或仅测试您设法转换为HQL的版本,如果遇到性能问题,请在此处或网站上发布新问题。
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 = ? ;
DELETE FROM A 
WHERE A.xid IN 
      ( SELECT B.xid 
        FROM B 
          JOIN C ON <condition> 
          JOIN D ON <condition> 
        WHERE D.name = ?
      ) ;
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"
      ) ;