Heim >Datenbank >MySQL-Tutorial >Wie behebe ich den DISTINCT ON Mismatched ORDER BY-Klauselfehler von PostgreSQL?

Wie behebe ich den DISTINCT ON Mismatched ORDER BY-Klauselfehler von PostgreSQL?

Susan Sarandon
Susan SarandonOriginal
2025-01-21 12:08:11174Durchsuche

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

Fehlerbehebung beim DISTINCT ON-Klausel-Mismatch-Fehler von PostgreSQL

Die DISTINCT ON-Klausel von PostgreSQL erfordert, dass der ORDER BY-Ausdruck genau mit den verschiedenen Spalten übereinstimmt. Der Versuch einer Abfrage mit unterschiedlichen Ausdrücken führt zu einem Fehler. Das einfache Hinzufügen des address_id als erstes Element in der ORDER BY-Klausel ist zwar eine Lösung für den Fehler, führt jedoch möglicherweise nicht zu den beabsichtigten Ergebnissen.

Hier sind alternative Methoden zum Abrufen der korrekten Daten, ohne das ORDER BY innerhalb der DISTINCT ON-Klausel zu ändern:

Methode 1: Greatest-N-Per-Group-Ansatz (DBMS-agnostisch)

Diese Methode verwendet eine Unterabfrage, um das Maximum purchased_at für jedes address_id zu finden, und verbindet dann wieder mit der Originaltabelle, um die vollständige Zeile abzurufen:

<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>

Methode 2: PostgreSQL-spezifische Lösung

Dieser Ansatz nutzt eine verschachtelte Abfrage, wobei DISTINCT ON in der inneren Abfrage verwendet wird, um die gewünschte Zeile für jedes address_id auszuwählen, und die Endergebnisse dann nach Bedarf in der äußeren Abfrage sortiert werden:

<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>

Diese Ansätze bieten flexible Lösungen zum Abrufen der erforderlichen Daten unter Beibehaltung der gewünschten Sortierreihenfolge, sodass keine Kompromisse beim DISTINCT ON-Ausdruck der ORDER BY-Klausel eingegangen werden müssen.

Das obige ist der detaillierte Inhalt vonWie behebe ich den DISTINCT ON Mismatched ORDER BY-Klauselfehler von PostgreSQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn