sql - 使用带有 orderBy 子句的连接列
问题描述
我有一个明显的错误“ORDER BY 表达式必须出现在选择列表中”,这是因为我的 select distinct 没有我试图按 ( d.name
) 排序的列,它已从另一个表中加入:
select distinct r.id,
r.name
from record r
inner join dict d on r.status_id = d.id
order by d.name desc
最明显的解决方案是添加d.code
到选择中,但我似乎无法轻松找到允许使用 rsql 查询解析器这样做的解决方案,
public Specification<T> parseQuery(String searchQuery, boolean distinct, ZoneId timeZone) {
if(Strings.isNullOrEmpty(searchQuery)) {
return null;
}
Node rootNode = new RSQLParser(operators).parse(searchQuery);
final Specification<T> accept = rootNode.accept(new CustomRsqlVisitor<>(timeZone));
if (!distinct || accept == null) {
return accept;
} else {
return (root, query, criteriaBuilder) -> {
Predicate predicate = accept.toPredicate(root, query, criteriaBuilder);
query.distinct(true);
return predicate;
};
}
}
因为它似乎是通过一个正在使用它的存储库来泛化的,而原始选择只使用已传递给它的实体。
有什么简单的解决方法可以让错误消失吗?(除了完全禁用不同)?
或者放弃整个规范,是否应该运行一个特定的 postgres 查询以避免此错误,而不是将 orderBy 字段放入 select 中?
解决方案
我假设你想要name
from r
:
select distinct r.id, r.name
from record r join
dict d
on r.status_id = d.id
order by r.name desc;
编辑:
仔细检查问题表明你确实想要d.code
。如果你真的想要一个未选择的列d
,那么你可以使用group by
:
select r.id, r.name
from record r join
dict d
on r.status_id = d.id
group by r.id, r.name
order by max(d.code) desc;
请注意在order by
.
推荐阅读
- esp32 - 无法将原始 ADC1 读数转换为电压
- postgresql - 如何从 Postgres jsonb 对象中删除键数组?
- sql - 对分页符组求和
- python - 我有一个形状为 (601, 2522) 的数据框。我希望索引从数据框的第二行开始
- python - 如何使用 numpy 修复“数组索引过多”错误?
- alexa-skill - Alexa智能家居,模式控制器不工作
- google-cloud-platform - 如何将 Anthos 用于家庭或个人计算资源?
- unity3d - 使用注视控件忽略空间映射
- javascript - prototypejs - 为带有类的按钮创建点击事件
- sql-server - RDS SQL Server 压缩