Heim >Datenbank >MySQL-Tutorial >Wie kann ich eine Set-Return-Funktion mit einem Array-Argument in PostgreSQL effizient mehrmals aufrufen?
Mehrmaliges Aufrufen einer Mengenrückgabefunktion mit einem Array-Argument
Diese Diskussion dreht sich um eine Mengenrückgabefunktion namens foo, die verarbeiten kann Ein Array von Daten, das einen bestimmten Parameter verwendet und ein Ergebnis liefert, das eine Reihe von Zeilen und eine zusätzliche Spalte enthält. Während die Funktion erfolgreich mit einem einzelnen Datensatz funktioniert, stößt sie auf Herausforderungen, wenn versucht wird, mehrere Datensätze zu verarbeiten, ohne sich für die Referenzierung auf eine Daten-ID zu verlassen.
Verschiedene Versuche, die Syntax zu ändern, z. B. die Verwendung des folgenden Formats:
SELECT dataid, (foo(ARRAY_AGG(data)),1).* FROM dataset WHERE dataid = something -- only testing on 1 GROUP BY dataid
war nicht erfolgreich, was dazu führte, dass die Funktion für jede Spalte wiederholt aufgerufen wurde.
Lösung: Lateral Join
In PostgreSQL-Versionen 9.3 und höher führt die Verwendung eines LEFT JOIN LATERAL-Konstrukts normalerweise zu optimalen Ergebnissen:
SELECT sub.dataid, f.* FROM ( SELECT dataid, array_agg(data) AS arr FROM dataset WHERE dataid = something GROUP BY 1 ) sub LEFT JOIN LATERAL foo(sub.arr) f ON true;
Diese Syntax stellt sicher, dass alle Zeilen links vom Join bleiben erhalten, auch wenn die Funktion foo keine Zeilen zurückgibt.
Wenn foo kann Wenn tatsächlich keine Zeilen zurückgegeben werden und der Ausschluss dieser Zeilen erwünscht ist, kann die folgende Syntax verwendet werden:
CROSS JOIN LATERAL foo(sub.arr)
oder ihre Kurzversion:
, foo(sub.arr)
Dieser Ansatz ist im PostgreSQL-Handbuch dokumentiert.
Das obige ist der detaillierte Inhalt vonWie kann ich eine Set-Return-Funktion mit einem Array-Argument in PostgreSQL effizient mehrmals aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!