gpt4 book ai didi

sql - 使用 HQL 在 from 子句中进行子查询

转载 作者:行者123 更新时间:2023-12-04 16:10:10 24 4
gpt4 key购买 nike

我有一张 table articles有 50 万行。一篇文章有​​一个作者列表。我正在尝试创建一个查询以获取作者列表的最新发表文章。

我使用了以下 HQL 查询,它得到了我想要的但运行速度很慢(~4s)

            select author, article
from Article article inner join article.authors author
where (author.id, article.publishedAt) in
(select author.id, max(article.publishedAt)
from Article article join article.authors author
where author.id in (authors_list))
group by author.id

在普通 sql 中可能更好的查询是:
              select * from (
select articles.id, author.id
from articles, article_authors, authors
where articles.id = article_authors.article_id and
article_authors.author_id=authors.id
and author.id in (author_list)
order by articles.publishedAt desc
) b
group by authors.id;

但是从 Hibernate 文档中可以看出 HQL 子查询只能出现在 select 或 where 子句中。
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-subqueries

有没有办法使用 HQL 或其他方式来模拟这种查询来提高查询的性能?

最佳答案

在任何一种情况下,您都希望尝试分离用于比较的数据是否很大。在上面的第一个查询中,您有:

in 
(select author.id, max(article.publishedAt)
from Article article join article.authors author
where author.id in (authors_list))

尝试先将该语句放入临时表中,然后使用该小数据集以提高效率。
所以它看起来像:
select author.id, max(article.publishedAt) into #temp1
from Article article join article.authors author
where author.id in (authors_list))

select author, article
from Article article inner join article.authors author
where (author.id, article.publishedAt) in
(select author.id, article.publishedAt
from #temp1)
group by author.id

因为计算完成,然后数据集更小,它应该提高性能。

关于sql - 使用 HQL 在 from 子句中进行子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21284440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com