0

Ubuntu 上の PostgreSQL 8.3 には、T1、T2、T3 など、異なるスキーマの 3 つのテーブルがあります。それらのそれぞれには、私が知っている ID のオブジェクトに関連する (いくつかの) レコードが含まれています。「psql」を使用して、私は頻繁に 3 つの操作を行います。

SELECT field-set1 FROM T1 WHERE ID='abc';

SELECT field-set2 FROM T2 WHERE ID='abc';

SELECT field-set3 FROM T3 WHERE ID='abc';

結果を見てください。私にとっては見るだけで十分です。

1 つのパラメータ 'id' を持つプロシージャ/関数/マクロなどを使用して、3 つの SELECT を次々に実行し、結果を画面に表示することは可能ですか?

field-set1、field-set2、field-set 3 は完全に異なります。

テーブル T1、T2、T3 を結合する合理的な方法はありません。これらは無関係なデータです。JOINしたくない。結果の 3 つのセットを画面に表示したいと思います。

ヒントはありますか?

4

2 に答える 2

2

手っ取り早い方法

行の型 (順番にあるすべての列のデータ型) が一致しない場合、UNION失敗します。ただし、PostgreSQL では、行全体をその表現にキャスト
できます。text

SELECT t1:text AS whole_row_in_text_representation FROM t1 WHERE id = 'abc'

UNION ALL
SELECT t2::text FROM t2 WHERE id = 'abc'

UNION ALL
SELECT t3::text FROM t3 WHERE id = 'abc';

最後に1 つだけ;で、1 つのステートメントで省略可能です。


より洗練された代替手段

しかし、さらに多くのコードが必要です。最初に列が最も多いテーブルを選択し、個々の列をすべてテキストにキャストして、一般的な名前を付けます。NULL列が少ない他のテーブルの値を追加します。テーブル間にヘッダーを挿入することもできます:

SELECT '-t1-'::text AS c1, '---'::text AS c2, '---'::text AS c1  -- table t1
UNION ALL
SELECT '-col1-'::text, '-col2-'::text, '-col3-'::text  -- 3 columns
UNION ALL
SELECT col1::text, col2::text, col3::text FROM t1 WHERE id = 'abc'

UNION ALL
SELECT '-t2-'::text, '---'::text, '---'::text  -- table t2
UNION ALL
SELECT '-col_a-'::text, '-col_b-'::text, NULL::text  -- 2 columns, 1 NULL
UNION ALL
SELECT col_a::text, col_b::text, NULL::text FROM t2 WHERE id = 'abc'

...
于 2012-07-10T18:42:20.860 に答える
1

間に a を入れて、union allすべての列に同じ名前を付けます

 SELECT field-set1 as fieldset FROM T1 WHERE ID='abc';
 union all
 SELECT field-set2 as fieldset FROM T2 WHERE ID='abc';
 union all
 SELECT field-set3 as fieldset FROM T3 WHERE ID='abc';

そして一気に実行。

于 2012-07-10T18:34:38.253 に答える