そのサブセレクトを疑似列としてテーブルに格納する方法はありますか?
VIEW
アドバイスされているようなものは、完全に有効な解決策です。頑張れ。
しかし、あなたの質問にさらに密接に適合する別の方法があります。「計算フィールド」または「生成された列」をエミュレートするために、テーブル型をパラメーターとして受け取る関数を作成できます。
あなたの説明から派生したこのテストケースを考えてみましょう:
CREATE TABLE tbl_a (a_id int, col1 int, col2 int);
INSERT INTO tbl_a VALUES (1,1,1), (2,2,2), (3,3,3), (4,4,4);
CREATE TABLE tbl_b (b_id int, a_id int, colx int);
INSERT INTO tbl_b VALUES
(1,1,5), (2,1,5), (3,1,1)
, (4,2,8), (5,2,8), (6,2,6)
, (7,3,11), (8,3,11), (9,3,11);
エミュレートする関数を作成しますcol3
:
CREATE FUNCTION col3(tbl_a)
RETURNS int8
LANGUAGE sql STABLE AS
$func$
SELECT sum(colx)
FROM tbl_b b
WHERE b.a_id = $1.a_id
$func$;
これで、次のクエリを実行できます。
SELECT a_id, col1, col2, tbl_a.col3
FROM tbl_a;
あるいは:
SELECT *, a.col3 FROM tbl_a a;
だけでなくtbl_a.col3
/の書き方に注意してください。これは不可欠です。a.col3
col3
Oracleの「仮想列」とは異なり、SELECT * FROM tbl_a
. そのためにa を使用できますVIEW
。
なぜこれが機能するのですか?
テーブルの列を参照する一般的な方法は、属性表記を使用することです。
tbl_aから tbl_a.col1を選択します。
関数を呼び出す一般的な方法は、関数表記法です。
SELECT col3(tbl_a) ;
一般に、SQL 標準に準拠するこれらの正規の方法に固執するのが最善です。
ただし、Postgres では属性表記も使用できます。これらも同様に機能します:
SELECT col1(tbl_a) FROM tbl_a;
SELECT tbl_a.col3 ;
詳しくはマニュアルで。
おそらく、これがどこに向かっているのか、もうおわかりでしょう。これは、テーブルの余分な列を追加するように見えますが、実際には現在の行(またはそのエイリアス) を行タイプの引数として取り、値を計算する関数です。tbl_a
col3()
tbl_a
SELECT *, a.col3
FROM tbl_a AS a;
実際の列がある場合、それが優先され、システムは行をパラメータとしてcol3
取るその名前の関数を探しません。tbl_a
その「美しさ」: から列を追加または削除できtbl_a
、最後のクエリは現在のすべての列を動的に返します。ビューは、作成時に存在した列のみを返します (アーリー バインディングと のレイト バインディング*
)。
もちろん、ここでテーブルを削除する前に、依存する関数を削除する必要があります。また、テーブルに変更を加えるときに関数を無効にしないように注意する必要があります。
私はまだそれを使用しません。無実の読者にとってはあまりにも驚くべきことです。