Heim >Datenbank >MySQL-Tutorial >Warum sind die zurückgegebenen Spalten meiner PostgreSQL-Funktion verkettet und wie kann ich das beheben?
Der von der Funktion zurückgegebene Datensatz weist verkettete Spalten auf
Beim Verwenden einer Funktion zum Abrufen von Daten für einen bestimmten Zweck kann es vorkommen, dass die zurückgegebenen Daten zurückgegeben werden Die Spalten des Datensatzes werden zu einer einzigen Spalte verkettet. Dies kann auftreten, wenn die Funktion als Unterabfrage in einer anderen Abfrage verwendet wird.
Funktionsergebnisse verstehen
Um die von der Funktion zurückgegebene Zeile zu zerlegen und die einzelnen Spalten zu erhalten, Führen Sie die Funktion einfach separat aus:
SELECT * FROM account_servicetier_for_day(20424, '2014-08-12');
Dies liefert die Ausgabe mit der erwarteten Spaltenanordnung Struktur.
Adressierung der ursprünglichen Abfrage
Um das Problem mit der ursprünglichen Abfrage zu lösen, gibt es je nach verwendeter PostgreSQL-Version mehrere Ansätze:
PostgreSQL 9.3 oder neuer
Verwenden Sie JOIN LATERAL, um die Verbindung herzustellen Unterabfrage und behalten Sie die Zeilenstruktur bei:
SELECT '2014-08-12' AS day, 0 AS inbytes, 0 AS outbytes , a.username, a.accountid, a.userid , f.* -- but avoid duplicate column names! FROM account_tab a , account_servicetier_for_day(a.accountid, '2014-08-12') f -- <-- HERE WHERE a.isdsl = 1 AND a.dslservicetypeid IS NOT NULL AND NOT EXISTS ( SELECT FROM dailyaccounting_tab WHERE day = '2014-08-12' AND accountid = a.accountid ) ORDER BY a.username;
PostgreSQL 9.2 oder älter
Verwenden Sie eine Unterabfrage, um die Funktion aufzurufen und die Zeile in der äußeren Abfrage zu zerlegen:
SELECT '2014-08-12' AS day, 0 AS inbytes, 0 AS outbytes , a.username, a.accountid, a.userid , (a.rec).* -- but be wary of duplicate column names! FROM ( SELECT *, account_servicetier_for_day(a.accountid, '2014-08-12') AS rec FROM account_tab a WHERE a.isdsl = 1 AND a.dslservicetypeid Is Not Null AND NOT EXISTS ( SELECT FROM dailyaccounting_tab WHERE day = '2014-08-12' AND accountid = a.accountid ) ) a ORDER BY a.username;
Achten Sie bei beiden Ansätzen auf mögliche doppelte Spaltennamen, wenn Sie die zerlegte Datei auswählen Zeile.
Das obige ist der detaillierte Inhalt vonWarum sind die zurückgegebenen Spalten meiner PostgreSQL-Funktion verkettet und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!