内部で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
内部で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
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;
データ変更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