Heim >Datenbank >MySQL-Tutorial >Wie behebe ich den DISTINCT ON Mismatched ORDER BY-Klauselfehler von PostgreSQL?
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!