首页 >数据库 >mysql教程 >如何解决 PostgreSQL 的'SELECT DISTINCT ON 表达式必须与初始 ORDER BY 表达式匹配”错误?

如何解决 PostgreSQL 的'SELECT DISTINCT ON 表达式必须与初始 ORDER BY 表达式匹配”错误?

Linda Hamilton
Linda Hamilton原创
2025-01-21 12:17:09258浏览

How to Resolve PostgreSQL's

PostgreSQL DISTINCT ON 错误:不匹配 ORDER BY 子句

将 PostgreSQL 的 DISTINCT ON 与包含不同表达式的 ORDER BY 子句一起使用可能会导致错误:“SELECT DISTINCT ON 表达式必须与初始 ORDER BY 表达式匹配。” 发生这种情况是因为 DISTINCT ON 根据指定的列选择唯一行,而 ORDER BY 指示这些唯一行的呈现顺序。 因此,DISTINCT ON 中的列必须与 ORDER BY 子句中的前导列匹配。

例如,如果您需要检索不同的 address_id 值,同时对具有最新 purchased_at 时间戳的行进行优先级排序,那么在使用 address_id 时,仅按 ORDER BY 子句中的 DISTINCT ON (address_id) 进行排序是不够的。 这是因为 DISTINCT ON 会根据 子句为遇到的每个 选择 address_id第一个 ORDER BY 行。

这里有两个有效的解决方法:

方法一:子查询求最大值purchased_at

此方法使用子查询来查找每个 purchased_at 的最大值 address_id,然后将此结果连接回原始表以选择相应的行:

<code class="language-sql">SELECT t1.*
FROM purchases t1
JOIN (
    SELECT address_id, MAX(purchased_at) AS max_purchased_at
    FROM purchases
    WHERE product_id = 1
    GROUP BY address_id
) t2
ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at
ORDER BY t1.purchased_at DESC;</code>

方法 2:使用 DISTINCT ONORDER BY

嵌套查询

这个 PostgreSQL 特定的解决方案使用嵌套查询。内部查询使用 DISTINCT ON 选择所需的唯一行,并进行适当排序,外部查询对结果重新排序:

<code class="language-sql">SELECT *
FROM (
  SELECT DISTINCT ON (address_id) *
  FROM purchases
  WHERE product_id = 1
  ORDER BY address_id, purchased_at DESC
) t
ORDER BY purchased_at DESC;</code>

两种方法都提供了高效且准确的结果,克服了直接组合 DISTINCT ON 和不匹配的 ORDER BY 子句带来的限制。 选择最适合您的编码风格和数据库性能要求的方法。

以上是如何解决 PostgreSQL 的'SELECT DISTINCT ON 表达式必须与初始 ORDER BY 表达式匹配”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn