0

我有这个查询(已经精简但实际上更复杂):

SELECT
    e.id,
    string_agg(csb.description, ',' ORDER BY cs.id ASC) AS condition_set_descriptions
FROM event e
JOIN event_trigger_version etv ON e.event_trigger_version_id = etv.id
LEFT JOIN event_condition_set ecs ON ecs.event_id = e.id
JOIN condition_set cs ON cs.id = ecs.condition_set_id
JOIN condition_set_base csb ON cs.condition_set_base_id = csb.id
JOIN subject s ON e.subject_id = s.id
GROUP BY
    e.id, event_level, s.name
ORDER BY s.name ASC, condition_set_descriptions ASC, event_level DESC
LIMIT 20 OFFSET 0

现在我也可以有一个动态的ORDER BY包括其他列(在这个例子中省略了),但总是包括condition_set_descriptions顺序中的某个地方。此列是string_agg函数的结果。我不能将它移动到子查询,因为LIMIT设置的应该适用于定义的列组合的结果。ORDER BY

该示例工作正常,但缺点是该condition_set_descriptions列也作为查询的结果返回,但这是很多数据并且实际上并不需要(因为使用省略的一些以另一种方式查找实际描述数据)。所需要的只是对结果进行排序。如果不在子查询中选择它会破坏多排序受限结果集的正确性,我该如何做到这一点?

4

1 回答 1

2

ORDER BY 也可以处理计算表达式;不一定是您在 SELECT 中计算某些内容,然后在 ORDER BY 中使用别名并引用别名

看看做:

SELECT
    e.id
FROM 
  ...
ORDER BY 
    s.name ASC,
    string_agg(csb.description, ',' ORDER BY cs.id ASC) ASC, 
    event_level DESC
LIMIT 20 OFFSET 0

还要仔细检查您在内连接中间是否有左连接;当下一个表内部连接到它时,它产生的任何空值都将被再次删除,因此您可以内部连接它,或者如果您正在丢失数据,请采用以下模式:

w
JOIN x
LEFT JOIN (
  y
  JOIN z
) a

即不要左连接 y 到 x 然后内连接 z 到 y,先内连接 y 和 z 然后左连接结果到 x

于 2022-02-07T07:01:01.407 回答