Heim > Datenbank > MySQL-Tutorial > Warum werden die zurückgegebenen Spalten meiner Funktion in einem PostgreSQL-Join verkettet und wie kann ich das Problem beheben?

Warum werden die zurückgegebenen Spalten meiner Funktion in einem PostgreSQL-Join verkettet und wie kann ich das Problem beheben?

Patricia Arquette
Freigeben: 2024-12-31 18:39:10
Original
768 Leute haben es durchsucht

Why are my function's returned columns concatenated in a PostgreSQL join, and how can I fix it?

Spalten im von der Funktion zurückgegebenen Datensatz verkettet

Beim Zusammenführen von Daten aus zwei oder mehr Tabellen ist es wichtig, eine ordnungsgemäße Trennung der Spalten sicherzustellen, um dies zu vermeiden Dateninkonsistenzen. In bestimmten Datenbankumgebungen wie PostgreSQL 9.2.4 können jedoch Probleme auftreten, bei denen von einer Funktion zurückgegebene Spalten zu einer einzigen Spalte verkettet werden.

Problembeschreibung

Bedenken Sie Ein Szenario, in dem eine Abfrage eine Funktion umfasst, die historische Daten aus einer Tabelle basierend auf einer Konto-ID und einem bestimmten Datum abruft. Wenn die Funktion direkt ausgeführt wird, werden die Ergebnisse wie erwartet zurückgegeben, wobei jede Spalte ihre jeweiligen Daten enthält. Wenn die Funktion jedoch innerhalb einer größeren Abfrage verwendet wird, werden die Spalten der Funktion zu einer einzigen Spalte verkettet. Dies kann die Lesbarkeit und Analyse der Daten erheblich beeinträchtigen.

Lösung

Um dieses Problem zu lösen, gibt es zwei Hauptansätze:

Ansatz 1 : Zerlegen von Zeilen (Postgres 9.3 oder neuer)

Postgres 9.3 und In späteren Versionen wurde die JOIN LATERAL-Syntax eingeführt, die den Prozess der Zerlegung von von einer Funktion zurückgegebenen Zeilen vereinfacht:

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;
Nach dem Login kopieren

Ansatz 2: Unterabfrage mit Datensatzzerlegung (Postgres 9.2 oder älter)

Für Postgres-Versionen 9.2 und älter besteht eine alternative Methode darin, eine Unterabfrage zu verwenden, die zerlegt der Zeilentyp:

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;
Nach dem Login kopieren

Durch die Implementierung dieser Methoden können Sie von Funktionen zurückgegebene Zeilen effektiv zerlegen und beim Zusammenführen von Tabellen in PostgreSQL eine genaue Datentrennung sicherstellen.

Das obige ist der detaillierte Inhalt vonWarum werden die zurückgegebenen Spalten meiner Funktion in einem PostgreSQL-Join verkettet und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage