在plpgsql中使用CTE

时间:2012-05-28 17:34:40

标签: postgresql plpgsql common-table-expression

我正在尝试在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

2 个答案:

答案 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进行表格限定。