【问题标题】:Delete from subquery从子查询中删除
【发布时间】:2013-08-28 13:30:35
【问题描述】:

我在我的应用程序中使用 Hibernate。目前我正在尝试执行以下查询:

DELETE FROM ActiveTimes a WHERE
a.begin>=:from AND a.begin<=:to
AND a.end>=:from AND a.end<=:to
    AND a in( 
         SELECT al FROM ActiveTimes al 
             JOIN al.source.stage st
         JOIN st.level.dataSource ds
     WHERE ds=:dataSource)

但我收到一个错误:Column 'id' in field list is ambiguous。 这感觉很正常,因为创建的 SQL 查询如下所示:

delete 
from
    active_times 
where
    begin>=? 
    and begin<=? 
    and end>=? 
    and end<=? 
    and (
        id in (
            select
                id 
            from
                active_times activeti1_ 
            inner join
                sources sourc2_ 
                    on activeti1_.source=sourc2_.id 
            inner join
                stage stage3_ 
                    on sourc2_.id=stage3_.source 
            inner join
                levels levels4_ 
                    on stage3_.level=levels4_.id 
            inner join
                datasources datasource5_ 
                    on levels4_.data_source=datasource5_.id 
            where
                id=?
        )
    )

如果我将查询更改为:

DELETE FROM ActiveTimes a WHERE
a.begin>=:from AND a.begin<=:to
AND a.end>=:from AND a.end<=:to
    AND a.id in( 
         SELECT al.id FROM ActiveTimes al 
             JOIN al.source.stage st
         JOIN st.level.dataSource ds
     WHERE ds.id=:dataSource)

我收到另一个错误:You can't specify target table 'active_times' for update in FROM clause

我对 JPQL(或 HQL)没有进行太多实验,所以我不明白为什么查询看起来像第一个示例中的那样。

出现新错误是因为显然我无法对 MySQL 中的删除表进行子查询。

对于如何重写上述查询之一以使其正常工作,您有什么建议吗?

【问题讨论】:

  • 这是 MySQL 的(许多)愚蠢限制之一。您需要将子选择重新写入连接。
  • @a_horse_with_no_name 你能详细说明一下这个想法吗?更重要的是,你能告诉我为什么第一个版本的查询被翻译成这样模棱两可吗?谢谢!
  • @a_horse_with_no_name 已发布答案。 JPQL 查询应该是这样的吗?
  • 对不起,我不使用 JPQL

标签: mysql sql hibernate jpa


【解决方案1】:

只需删除子查询。这是不必要的。我不确定如何在 Hybernate 中编写 SQL 代码,但我猜应该是这样的:

DELETE a 

FROM   ActiveTimes a

       JOIN a.source.stage st
       JOIN st.level.dataSource ds

WHERE  a.begin>=:from AND a.begin<=:to
       AND a.end>=:from AND a.end<=:to
       AND ds.id=:dataSource;

【讨论】:

  • 如果我按照您的建议进行操作,我会收到此错误:unexpected token: FROM near line 1, column 10
  • DELETE之后删除a,语法为delete from ...
  • 谢谢贝拉巴克斯。它会知道从 ActiveTimes 表中删除吗?在 MySQL 中,您包含别名,因此如果您的 FROM 子句中有多个表,它知道要从哪个表中删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多