これはearlier oneへのフォローアップの質問です。私は2つの引数を取るストアドファンクションf1
を持っていますが、5つのカラムを持つテーブルが返されます。今のところ返される値は定数で、後で引数から計算されます。VIEW定義で「ERROR:列...複数回指定」
f1
の引数に対応する2つの列を持つテーブルt1
もあります。
t1
に格納されているすべての引数ペアについて、f1
から返されたすべての行の和集合を含むビューv1
を定義します。与えられた例のための結果であるべき値:も罰金であろう最初の2つの列が剥奪されている場合
+---+---+---+---+---+---+---+
| 2 | 3 | a | b | 1 | c | d |
+---+---+---+---+---+---+---+
| 4 | 5 | a | b | 1 | c | d |
+---+---+---+---+---+---+---+
、。 f1
は、特定の引数値に対して複数の行を返す可能性があることに注意してください。
私は、次のステートメントを試してみたが、それは私にこのエラーメッセージが表示できます:私は間違って何をやっている
ERROR: column "c4" specified more than once
CREATE VIEW v1 (c1, c2, c3, c4, c5)
AS SELECT * FROM
(SELECT c1, c2 FROM t1) AS x,
f1 (x.c1, x.c2);
を?ここで
は例を設定するには、前の文です:
CREATE OR REPLACE FUNCTION f1 (a1 INTEGER, a2 INTEGER)
RETURNS TABLE (c1 VARCHAR(20), c2 VARCHAR(20), c3 INTEGER, c4 VARCHAR(20), c5 VARCHAR(128))
AS $$
SELECT 'a'::VARCHAR(20), 'b'::VARCHAR(20), 1::INTEGER, 'c'::VARCHAR(20), 'd'::VARCHAR(128);
$$ LANGUAGE SQL;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (c1 INTEGER, c2 INTEGER);
INSERT INTO t1 (c1, c2)
VALUES (2,3), (4,5);
DROP VIEW IF EXISTS v1;
は '' *選択し、使用しないでください - 代わりにあなたが必要なフィールドを選択します。つまり、 'c1'は' f1'と 't1'の両方に存在します... – sgeddes
@sgeddes私はそれを試みますが、エラーメッセージは' c4'を引用します。優れたPostgreSQLの回答、こちら – Drux