1

内部でCTEを使用するplpgsql関数をPostgres8.4で作成しようとしていますが、構文エラーが発生します。彼らは許可されていませんか?

(このようなものは、コードなしでこれを書いていることを覚えておいてください。)

With foo as (SELECT id,a as alias FROM foo);
UPDATE zoo SET b = alias FROM foo WHERE id = foo.id;
^Error here
4

2 に答える 2

3
WITH foo as (
    SELECT id
       , a AS zalias
    FROM footable
    )
UPDATE zoo z
SET b = f.zalias
FROM foo f
WHERE z.id = f.id
   ;

注:「エイリアス」は予約語です。

Erwin BrandstetterによるコメントによるUPDATE:CTEは8.4のUPDATEステートメントでは無効です。9.1以降が必要です。CTEは実際には一種のインスタントビューであるため、CTE本体をビュー内に配置して参照することができます。

CREATE VIEW foo as (
    SELECT id
       , a AS zalias
    FROM footable
    );
UPDATE zoo z
SET b = f.zalias
FROM foo f
WHERE z.id = f.id
   ;
DROP VIEW foo;
于 2012-05-28T17:41:22.473 に答える
2

データ変更CTE(それが何であるか)はPostgreSQL8.4では利用できません

@wildplasserがCTEを変更するデータが導入されたPostgreSQL9.1以降で示すように、ステートメントはマイナーパッチで機能します。

8.4の非常に単純な置換は、サブクエリになります。

UPDATE zoo z
SET    b = f.alias
FROM  (SELECT id, a as alias FROM foo) f
WHERE  z.id = f.id;

この例はさらに単純化できます(ただし、実際のケースはもっと複雑かもしれません)。

UPDATE zoo z
SET    b = f.a
FROM   foo f
WHERE  z.id = f.id;

id内のあいまいな列名をテーブル修飾することを忘れないでください。WHERE

于 2012-05-28T19:16:55.023 に答える