頻繁に使用するクエリをテーブル列として保存しますか?
クエリ:
次の PostgreSQL クエリについて考えてみましょう:
<code class="language-sql">SELECT <col>, <col> , (SELECT sum(<colx>) FROM <othertable> WHERE <otherforeignkeycol> = <thiskeycol>) AS <col> FROM <tbl>;</code>
このサブクエリは複数のクエリにわたって同じままです。このサブクエリをテーブルの疑似列として保存して、レコードの関係に基づいてテーブル B の列の合計を表すテーブル A の列を簡単に選択できるようにすることはできますか?
答え:
1.
を表示します。ビューの作成は、必要なサブクエリを列の 1 つとして含む仮想テーブルを定義できる効率的なソリューションです。
2. 計算フィールド (ストレージ生成列)
PostgreSQL 11 で導入されたストレージ生成列は要件を満たしています。これらを使用すると、他の列 (サブクエリを含む) の値に基づいて動的に計算される列を定義できます。
計算フィールドを使用した実装:
次の形式を考えてみましょう:
<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>
関数を使用して計算フィールドを作成します:
<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>
これで次のクエリを実行できるようになります:
<code class="language-sql">SELECT a_id, col1, col2, col3(a_id) FROM tbl_a;</code>
手順:
計算フィールドは、テーブル内の現在の行に基づいて指定された列の値を提供することでサブクエリをシミュレートします。属性表記 (col3(a_id)
など) を使用して計算フィールドにアクセスします。この手法により、計算値の動的な取得が可能になり、SELECT * クエリとの互換性が維持されます。 ここでは関数定義が変更されており、a_id
をパラメーターとして直接使用することで、レコード書き込みの使用を回避し、クエリを簡素化していることに注意してください。
以上が一般的なサブクエリを PostgreSQL のテーブル列として保存する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。