首頁 >資料庫 >mysql教程 >如何解決 PostgreSQL 的 DISTINCT ON Mismatched ORDER BY Clause 錯誤?

如何解決 PostgreSQL 的 DISTINCT ON Mismatched ORDER BY Clause 錯誤?

Susan Sarandon
Susan Sarandon原創
2025-01-21 12:08:11137瀏覽

How to Resolve PostgreSQL's DISTINCT ON Mismatched ORDER BY Clause Error?

排除 PostgreSQL 的 DISTINCT ON 子句不符錯誤

PostgreSQL 的 DISTINCT ON 子句要求 ORDER BY 表達式精確地符合不同的欄位。 嘗試使用不同的表達式進行查詢將導致錯誤。 簡單地將 address_id 新增為 ORDER BY 子句中的第一個元素,雖然是錯誤的解決方案,但可能不會傳回預期結果。

以下是在不更改 ORDER BY 子句中的 DISTINCT ON 的情況下檢索正確資料的替代方法:

方法 1:每組最大 N 方法(與 DBMS 無​​關)

此方法使用子查詢來尋找每個 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:PostgreSQL 特定解決方案

此方法利用巢狀查詢,在內部查詢中使用 DISTINCT ON 為每個 address_id 選擇所需的行,然後在外部查詢中根據需要對最終結果進行排序:

<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 的 DISTINCT ON Mismatched ORDER BY Clause 錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn