SQL - 选择在其他表中至少出现一次的ID

时间:2016-10-19 00:10:01

标签: sql grails hql gorm

我正在尝试获取在OtherTable中至少出现一次的用户列表。以下是使用Grails的非常低效的HQL查询。通常,在查询中最多只能运行几百个用户,但在OtherTable中可能会有一百万个用户引用。

List<User> users = User.executeQuery("select user " +
                    "from User as user where user.id = any(" +
                    "select otherTable.user.id from OtherTable as otherTable)")

如何提高此查询的效率?

2 个答案:

答案 0 :(得分:2)

这个SQL可能更有效,

select distinct u.id from user as u
inner join other_table ot
on u.id = ot.id

这是一个HQL,

select distinct user
from User as user
inner join user.otherTable as ot

使用Criteria API

User.createCriteria().listDistinct {
    createAlias("otherTable","ot")
    eq('id','ot.id')
}

以上两点都需要正确映射您的域类。如果您没有OtherTable映射到User。试试这个,

select distinct user from User user, OtherTable ot
where user.id = ot.user_id

你可能已经注意到我们完全避免在这里进行全表扫描;它是一个单一的查询 - 与您发布的查询不同,后者使用子查询。使用id加入两个实体/表应该更有效 - 假设id列被编入索引。

答案 1 :(得分:0)

尝试以下查询:

List<User> users = User.executeQuery("select user " +
                    "from User as user where"  +
                    "user.id in (select distinct otherTable.user.id from OtherTable as otherTable)")

希望它会有所帮助!