3

これはおそらく単純なことですが、理解できませんでした。

テーブルの概要とGetSummary、概要のセットとして行を返す関数があります。このようにクエリできます

SELECT GetSummary(arg1, arg2)
GetSummary
-----------
(val1, val2, val3)

そして、このように実際の列を返します。

SELECT * FROM GetSummary(arg1, arg2)
col1  |   col2   | col3
------------------------
val1  |   val2   | val3

概要への挿入は正常に機能します。

INSERT INTO Summary (SELECT * FROM GetSummary(arg1, arg2));
INSERT 0 1

しかし、他のテーブルの列に基づいて一度に複数の行を挿入する方法がわかりません。私はこのようなことをしたいと思います:

INSERT INTO Summary (SELECT FROM GetSummary(OtherTable.x, OtherTable.y)
FROM OtherTable WHERE <some query>);

SELECT FROM GetSummary ..集計テーブルの行が返されないため、これは失敗します。クエリSELECT * FROM GetSummary ..はそれを行いますが、クエリの書き方がわかりません。

編集

投稿してから数分後にたまたま解決策にたどり着きました。正しい構文は

INSERT INTO Summary (SELECT (GetSummary(OtherTable.x, OtherTable.y)).*
FROM OtherTable WHERE <some query>);

(X).* 表記は、選択を列に展開します。

4

1 に答える 1

3

質問に追加されたソリューションには、まだ構文エラーがあります。そのはず:

INSERT INTO Summary
SELECT (GetSummary(o.x, o.y)).*
FROM   OtherTable o
WHERE  <some condition>;

必須:
- 1 つだけFROM

オプション:
- 必要なものを括弧で囲みませんSELECT
- 構文を簡素化するテーブル エイリアス。

複合型へのアクセスに関するマニュアル。


また、関数は1行 (または 0 行) を返すようになっているようです。その場合SETOFは、RETURNS節で theを削除する必要があります。それを作る:

CREATE FUNCTION getsummary( ... )
    RETURNS summary AS ...
于 2012-05-28T20:44:38.020 に答える