Von der Funktion zurückgegebener Datensatz zeigt verkettete Spalten: Ursache aufklären
In einer Abfrage Tabellen verknüpfen und historische Daten von einer Funktion abrufen, Benutzer Möglicherweise tritt ein Problem auf, bei dem von der Funktion zurückgegebene Spalten zu einer einzigen Zeichenfolge verkettet erscheinen. Diese Anomalie tritt auf, wenn die Funktion direkt in der Hauptabfrage verwendet wird.
Verstehen des Problems
Beim Abfragen einer Funktion, die mehrere Spalten zurückgibt, wie zum Beispiel:
account_servicetier_for_day(acct.accountid, '2014-08-12')
es gibt einen Datensatz zurück, der die angeforderten Daten enthält. Wenn dieser Datensatz jedoch in eine andere Abfrage eingebettet ist, interpretiert PostgreSQL ihn als einzelne verkettete Zeichenfolge.
Funktionsausgabe zerlegen
Um dies zu beheben, sollten Benutzer die Person extrahieren Spalten aus dem Datensatz der Funktion. In PostgreSQL-Versionen 9.3 und höher kann dies mithilfe der JOIN LATERAL-Syntax erreicht werden, die eine nahtlose Integration von Funktionen in die FROM-Klausel ermöglicht:
JOIN LATERAL account_servicetier_for_day(a.accountid, '2014-08-12') f ON TRUE
Die ON TRUE-Klausel stellt sicher, dass alle Zeilen von links Tabelle werden mit dem Ergebnis der Funktion verknüpft, unabhängig von der Anzahl der zurückgegebenen Zeilen.
In PostgreSQL 9.2 und früher erfordert das Extrahieren von Spaltendaten eine explizite Unterabfrage:
(SELECT *, account_servicetier_for_day(a.accountid, '2014-08-12') AS rec FROM account_tab a) AS a
Hier weist die Unterabfrage das Ergebnis des Funktionsaufrufs einem Datensatz namens rec zu. Die äußere Abfrage kann sich dann auf die Spalten des Datensatzes beziehen, z. B. a.rec.timestamp.
Not In (Unterabfrage) vermeiden
Zuletzt wird empfohlen, die Verwendung zu vermeiden NOT IN (Unterabfrage) für Satzausschluss. Bevorzugen Sie stattdessen die NOT EXISTS-Klausel, die effizienter und weniger anfällig für Leistungsprobleme ist.
Das obige ist der detaillierte Inhalt vonWarum werden die zurückgegebenen Spalten meiner Funktion in meiner PostgreSQL-Abfrage verkettet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!