POSTGRESQL NACH MYSQL: Konvertieren von SELECT DISTINCT ON-Abfragen
Die Navigation durch Datenbankmigrationen kann eine Herausforderung sein, insbesondere beim Übergang von PostgreSQL zu MySQL. Ein häufiges Abfragekonstrukt, SELECT DISTINCT ON, wirft Fragen zu seinem MySQL-Gegenstück auf.
Postgresql SELECT DISTINCT ON
In PostgreSQL ermöglicht SELECT DISTINCT ON die Eliminierung von Duplikaten Zeilen basierend auf angegebenen Ausdrücken (col1, col2, col3) unter Beibehaltung der „ersten“ Zeile für jeden eindeutigen Satz. Wenn eine Tabelle beispielsweise doppelte Zeilen enthält:
col1 | col2 | col3 | col4 | col5 -------------------------------- 1 | 2 | 3 | 777 | 888 1 | 2 | 3 | 888 | 999 3 | 3 | 3 | 555 | 555
Die Abfrage SELECT DISTINCT ON (col1, col2, col3) col4, col5 FROM tablename würde Folgendes zurückgeben:
col4 | col5 ----------- 777 | 888 555 | 555
Die Auswahl der „ersten“ Zeile ist ohne Angabe einer ORDER BY-Klausel unvorhersehbar.
MySQL-Erweiterung zu GROUP BY
MySQL erweitert die Verwendung von GROUP BY und ermöglicht die Auswahl von nicht aggregierten Spalten, die nicht explizit in der GROUP BY-Klausel benannt sind. Allerdings ist die Auswahl des Werts aus jeder Gruppe durch den Server willkürlich, was zu unvorhersehbaren Werten in der Abfrageausgabe führt.
Konvertierung in MySQL
MySQL fehlt ein genaues Äquivalent dazu PostgreSQL SELECT DISTINCT ON-Konstrukt. Ein Ansatz zur Emulation seiner Funktionalität ist die MySQL-Erweiterung zu GROUP BY:
SELECT col4, col5 FROM tablename GROUP BY col1, col2, col3
Diese Abfrage gibt die „erste“ Zeile für jeden Satz (col1, col2, col3) zurück, ähnlich der PostgreSQL-Abfrage. Die zurückgegebene Zeile bleibt jedoch aufgrund des Fehlens einer order by-Klausel unbestimmt.
Eine genauere Auswahl der „ersten“ Zeile kann durch Ändern der Abfrage erreicht werden:
SELECT t1.col4, t1.col5 FROM tablename t1 INNER JOIN (SELECT col1, col2, col3, MIN(col4) as m_col4 FROM tablename GROUP BY col1, col2, col3) s ON t1.col1=s.col1 AND t1.col2=s.col2 AND t1.col3=s.col3 AND t1.col4=s.m_col4 GROUP BY t1.col1, t1.col2, t1.col3, t1.col4
Dies Die Abfrage ruft effektiv die Zeile mit dem Mindestwert für Spalte 4 für jeden eindeutigen Ausdruckssatz (Spalte 1, Spalte 2, Spalte 3) ab und sorgt so für eine vorhersehbarere Ausgabe.
Schlussfolgerung
Die Konvertierung von PostgreSQL-Abfragen in MySQL-Gegenstücke erfordert eine Einzelfallanalyse. Auch wenn es möglicherweise nicht immer exakte Entsprechungen gibt, bieten verschiedene Strategien und Problemumgehungen Lösungen, von relativ einfach bis mäßig komplex, abhängig von der Art der Abfrage.
Das obige ist der detaillierte Inhalt vonWie repliziere ich die SELECT DISTINCT ON-Funktionalität von PostgreSQL in MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!