【发布时间】:2015-11-05 11:16:30
【问题描述】:
(根据原文编辑)。
在 plpgsql (PostgreSQL 9.2) 中,我有一个函数定义为:
CREATE OR REPLACE FUNCTION test (patient_recid integer, tencounter timestamp without time zone)
RETURNS SETOF view_dx AS
$BODY$
#variable_conflict use_column
DECLARE
r view_dx%rowtype;
BEGIN
FOR r IN
With person AS (
select ....
)
, alldx AS (
select ....
)
............
select ... from first cte
union
select ... from second cte
union
etc., etc.,
LOOP
r.tposted = ( .
With person AS (
... SAME AS ABOVE,
alldx AS (
... SAME AS ABOVE,
)
select max(b.tposted)
from alldx b
where r.cicd9 = b.code and r.cdesc = b.cdesc);
r.treated = (
With person AS (
........SAME AS ABOVE )
, alldx AS (
........SAME AS ABOVE
)
select ...);
r.resolved = (
With person AS (
select p.chart_recid as recid
from patients p
where p.recid = patient_recid
)
...etc, etc,
RETURN NEXT r;
END LOOP;
RETURN;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION test(integer, timestamp without time zone)
OWNER TO postgres;
编辑:本质上,我定义了多个 cte,它们在具有多个联合的代码的“For r IN”部分中运行良好,但是在执行 LOOP...END LOOP 部分时,需要使用每个 SELECT 重新定义每个 CTE陈述。有没有避免同一个 CTE 有多个定义的好方法?
或者有没有更好(即更快)的方法来做到这一点。
欢迎和赞赏所有建议。
TIA
【问题讨论】:
-
IIUC 你可以去掉联合:联合的所有部分实际上都是
SELECT code, cdesc, ... FROM alldx其中部分联合可以编码为位域:, EXISTS(__subquery__) AS is_final_diagnosis,甚至作为 LEFT JOIN(如果需要额外的列) -
对于一个明确定义的问题,这里的代码太多了。也许是 codereview.stackexchange.com/ 的候选人 ...
-
@ErwinBrandstetter 请参阅上面的编辑...我会缩短它。 :)
-
@ErwinBrandstetter 我将代码添加到 codereview.stackexchange.com
标签: database postgresql plpgsql