我正在尝试在Postgres 8.4中创建一个plpgsql函数,它在内部使用CTE,但它给了我一个语法错误。他们不被允许吗?
(像这样的东西,记住我没有我的代码就写这个。)
With foo as (SELECT id,a as alias FROM foo);
UPDATE zoo SET b = alias FROM foo WHERE id = foo.id;
^Error here
答案 0 :(得分: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的评论更新: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;
答案 1 :(得分:2)
data modifying CTE(就是这样)在PostgreSQL 8.4 中不可用。
你的陈述适用于小补丁,因为@wildplasser在PostgreSQL 9.1 或更高版本中演示,其中引入了修改CTE的数据。
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
进行表格限定。