我有这样的SQL语句:
SELECT * FROM person inner join (select max(validityId) as maxID from person group by personId) maxID on maxID.maxID = person.validityid;
因此,它为personID提供了“区别”行:
如果我有这样的表:
| personID | validitID | value |
-------------------------------------------
| 1 | 10 | 400 |
| 1 | 11 | 500 |
| 1 | 12 | 600 |
| 2 | 13 | 700 |
| 2 | 14 | 800 |
| 2 | 15 | 900 |
| 4 | 16 | 1000 |
它会回来
| personID | validitID | value |
-------------------------------------------
| 1 | 12 | 600 |
| 2 | 15 | 900 |
| 4 | 16 | 1000 |
现在,我尝试通过JPA CriteriaBuilder进行此操作。
我的第一个想法是子查询:
final CriteriaBuilder cb = this.em.getCriteriaBuilder();
final CriteriaQuery<Person> cq = cb.createQuery(Person.class);
final Root<Person> root = cq.from(Person.class);
cq.select(root);
final Subquery<Long> subquery = cq.subquery(Long.class);
final Root<Person> validityIDSQ = subquery.from(Person.class);
subquery.select(validityIDSQ.get(Person_.validityId));
subquery.groupBy(validityIDSQ.get(Person_.personId));
cb.where(cb.in(root.get(Person_.validityId)).value(subquery));
但这会产生错误
ERROR: column "person1_.validityid" must appear in the GROUP BY clause or be used in an aggregate function
怎么对这个?
马可
我认为解决方案比看起来简单。您忘记了包含cb.max ()
在CriteriaBuilder子查询中。以下代码执行您要查找的查询。
final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
final CriteriaQuery<Person> cq = cb.createQuery(Person.class);
final Root<Person> root = cq.from(Person.class);
cq.select(root);
final Subquery<Integer> subquery = cq.subquery(Integer.class);
final Root<Person> validityIDSQ = subquery.from(Person.class);
subquery.select(cb.max(validityIDSQ.get(Person_.validityID)));
subquery.groupBy(validityIDSQ.get(Person_.personID));
cq.where(cb.in(root.get(Person_.validityID)).value(subquery));
此代码将创建以下查询:
select
person0_.id as id1_0_,
person0_.personID as personID2_0_,
person0_.validityID as validity3_0_,
person0_.value as value4_0_
from
person person0_
where
person0_.validityID in (
select
max(person1_.validityID)
from
person person1_
group by
person1_.personID)
我认为您正在使用Postgres。没有cd.max()
它会产生您引用的错误,因为您使用GroupBy而不使用聚合函数。我在Postgres和MySQL上进行了测试。两者兼具魅力。
问题内容: 我正在重构Zend Framework 2 应用程序,以使用准则2.5 DBAL代替Zend_DB(ZF1)。我有以下Zend_Db查询: 这将导致以下MySQL查询: 我无法弄清楚如何使用教义2.5查询生成器加入子查询。在主查询中,我需要从子查询中选择列。 我在这里已经读到,该学说不支持加入子查询。如果仍然如此,是否可以使用主义DBAL的SQL查询构建器以其他方式编写此查询?原生SQ
目前我有以下查询: 产出: 它可以工作,但在加入前限制注释表。结果是,它选择前5个注释并映射它。id为5的所有评论将被忽略。 谢谢
问题内容: 此查询出了什么问题: 它在没有该子句的情况下起作用。我似乎忘记了我的SQL。 问题答案: MySQL INSERT语法不支持WHERE子句,因此您的查询将失败。假设您的列是唯一键或主键: 如果您要插入ID为1的新行,则应使用: 如果您尝试更改ID为1的现有行的weight / desiredWeight值,则应使用: 如果需要,还可以使用INSERT .. ON DUPLICATE K
问题内容: 我正在使用QueryDSL构建SQL查询,该查询包含以联合身份加入的多个子查询。这是我查询的基础: 然后,我有几个子查询来获取与事务关联的客户端名称。我将示例缩减为两个: 如何将它们结合在一起,并通过我的主要查询加入结合?这是我目前的尝试: 这样可以编译,但是在尝试运行时会在运行时生成无效的SQL 。可能的错误: 子查询联合的语法。 命名子查询结果列的表达式与中使用的路径表达式之间的连
本文向大家介绍关于laravel 子查询 & join的使用,包括了关于laravel 子查询 & join的使用的使用技巧和注意事项,需要的朋友参考一下 本项目中关联了2个数据库 在某个需求中,需要使用子查询获取snapshot快照表库的关联数据,从而实现以下sql逻辑 其中子查询主要用到以下query builder语句 而join语句中可传入匿名函数重新构造,如再其中加多几个连接条件,或者查
问题内容: 假设我们有两种索引类型:成员和餐厅。两者都包含城市属性。 我想过滤成员(例如按名称),并希望在结果中包括成员所在城市/城市的餐馆名称列表。 是否可以仅使用一个ES查询来执行此操作?我猜它应该类似于数据库联接。 谢谢。 问题答案: ES没有联接的概念。这是因为它是索引而不是关系数据库。最好打两个电话。一个获取会员的文件,然后另一个获取餐厅。 除非您有特殊情况,否则这仍然应该非常有效。