Heim >Datenbank >MySQL-Tutorial >Sollte ich allgemeine Unterabfragen als Tabellenspalten in PostgreSQL speichern?

Sollte ich allgemeine Unterabfragen als Tabellenspalten in PostgreSQL speichern?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-11 18:46:42589Durchsuche

Should I Store Common Subqueries as Table Columns in PostgreSQL?

Häufig verwendete Abfragen als Tabellenspalten speichern?

Abfrage:

Betrachten Sie die folgende PostgreSQL-Abfrage:

<code class="language-sql">SELECT <col>, <col>
     , (SELECT sum(<colx>)
        FROM   <othertable> 
        WHERE  <otherforeignkeycol> = <thiskeycol>) AS <col>
FROM   <tbl>;</code>

Diese Unterabfrage bleibt bei mehreren Abfragen gleich. Ist es möglich, diese Unterabfrage als Pseudospalte einer Tabelle zu speichern, sodass ich auf einfache Weise eine Spalte in Tabelle A auswählen kann, die die Summe der Spalten in Tabelle B basierend auf einer Datensatzbeziehung darstellt?

Antwort:

1. Anzeigen

Das Erstellen einer Ansicht ist eine effiziente Lösung, mit der Sie eine virtuelle Tabelle mit der erforderlichen Unterabfrage als eine ihrer Spalten definieren können.

2. Berechnete Felder (speichergenerierte Spalten)

Die in PostgreSQL 11 eingeführten speichergenerierten Spalten erfüllen Ihre Anforderungen. Damit können Sie eine Spalte definieren, die basierend auf den Werten anderer Spalten (einschließlich Unterabfragen) dynamisch berechnet wird.

Implementierung mithilfe berechneter Felder:

Betrachten Sie das folgende Formular:

<code class="language-sql">CREATE TABLE tbl_a (a_id int, col1 int, col2 int);
CREATE TABLE tbl_b (b_id int, a_id int, colx int);</code>

Erstellen Sie ein berechnetes Feld mit einer Funktion:

<code class="language-sql">CREATE FUNCTION col3(a_id INT)
  RETURNS int8
  LANGUAGE sql STABLE AS
$func$
SELECT sum(colx)
FROM   tbl_b b
WHERE  b.a_id = 
$func$;</code>

Jetzt können Sie abfragen:

<code class="language-sql">SELECT a_id, col1, col2, col3(a_id)
FROM   tbl_a;</code>

Anleitung:

Berechnete Felder simulieren eine Unterabfrage, indem sie den Wert einer angegebenen Spalte basierend auf der aktuellen Zeile in der Tabelle bereitstellen. Greifen Sie mithilfe der Attributnotation auf berechnete Felder zu (z. B. col3(a_id)). Diese Technik ermöglicht den dynamischen Abruf berechneter Werte und gewährleistet die Kompatibilität mit SELECT*-Abfragen. Beachten Sie, dass die Funktionsdefinition hier geändert wurde und a_id direkt als Parameter verwendet wird, wodurch das Schreiben von Datensätzen vermieden und die Abfrage vereinfacht wird.

Das obige ist der detaillierte Inhalt vonSollte ich allgemeine Unterabfragen als Tabellenspalten in PostgreSQL speichern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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