首页 > 解决方案 > 使用带有 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 中?

标签: sqlpostgresqlsql-order-bydistinct

解决方案


我假设你想要namefrom 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.


推荐阅读