Database 在PostgreSQL中使用带有窗口分区和字符串模式匹配的CTE的困难
我试图扩展我对PostgreSQL 9.1使用的CTE和窗口分区的理解。我的另一个问题就是一个例子。情况是,cdesc是一个文本字段,以前的数据库中添加了不必要的字符,以保持每个cdesc文本条目的不同和唯一性 问题是如何组合表CPT中与切除/活检病理学字符串模式匹配的所有条目 这样做失败,因为计划正在对完整且唯一的cdesc进行分组,而不仅仅是匹配的部分:Database 在PostgreSQL中使用带有窗口分区和字符串模式匹配的CTE的困难,database,postgresql,common-table-expression,Database,Postgresql,Common Table Expression,我试图扩展我对PostgreSQL 9.1使用的CTE和窗口分区的理解。我的另一个问题就是一个例子。情况是,cdesc是一个文本字段,以前的数据库中添加了不必要的字符,以保持每个cdesc文本条目的不同和唯一性 问题是如何组合表CPT中与切除/活检病理学字符串模式匹配的所有条目 这样做失败,因为计划正在对完整且唯一的cdesc进行分组,而不仅仅是匹配的部分: WITH plan AS ( SELECT recid, cdesc, min(recid) OVER (PARTITION BY cde
WITH plan AS (
SELECT recid, cdesc, min(recid) OVER (PARTITION BY cdesc) AS master_recid
FROM cpt
WHERE cpt.cdesc LIKE '%excision/biopsy pathology%'
)
, upd_lab AS (
UPDATE lab l
SET cpt_recid = p.master_recid
FROM plan p
WHERE l.cpt_recid = p.recid
AND p.recid <> p.master_recid
)
DELETE FROM cpt c
USING plan p
WHERE c.cdesc LIKE '%excision/biopsy pathology%'
AND c.recid = p.recid
AND p.recid <> p.master_recid
RETURNING c.recid;
我的问题是:
如何将字符串模式匹配用于分区,以及
如何调用upd_lab update将lab表中的记录移动到新的master_recid?
编辑1:
以下是我需要做的工作,但我仍然不清楚upd_实验室cte是如何命名的:
WITH plan AS (
SELECT recid, min(recid) OVER (PARTITION BY cdesc LIKE '%excision/biopsy pathology%') AS master_recid
FROM cpt
WHERE cpt.cdesc LIKE '%excision/biopsy pathology%'
)
, upd_lab AS (
UPDATE lab l
SET cpt_recid = p.master_recid -- link to master recid ...
FROM plan p
WHERE l.cpt_recid = p.recid
AND p.recid <> p.master_recid -- ... only if not linked to master
)
DELETE FROM cpt c
USING plan p
WHERE c.cdesc LIKE '%excision/biopsy pathology%'
AND c.recid = p.recid
AND p.recid <> p.master_recid -- ... only if notmaster
RETURNING c.recid;
只需通过删除分区即可。在哪里做你想要的工作:
WITH plan AS (
SELECT recid, cdesc, min(recid) OVER () AS master_recid
FROM cpt
WHERE cpt.cdesc LIKE '%excision/biopsy pathology%'
),
upd_lab AS (
UPDATE lab l
SET cpt_recid = p.master_recid
FROM plan p
WHERE l.cpt_recid = p.recid AND
p.recid <> p.master_recid
)
DELETE FROM cpt c
USING plan p
WHERE c.cdesc LIKE '%excision/biopsy pathology%' AND
c.recid = p.recid AND
p.recid <> p.master_recid
RETURNING c.recid;
upd_实验室cte如何命名?谢谢你的意思是什么,但我还不清楚upd_实验室cte是如何命名的?很明显,你打电话给它,它成功了。。。以开始。@ErwinBrandstetter如果我理解正确,With-计划和upd_实验室-将自动执行,而无需在父delete中为父delete访问的每一行显式调用。对吧?几乎是真的。但是,数据修改CTE的处理方式不同于仅使用SELECT的简单CTE。细节:
WITH plan AS (
SELECT recid, cdesc, min(recid) OVER () AS master_recid
FROM cpt
WHERE cpt.cdesc LIKE '%excision/biopsy pathology%'
),
upd_lab AS (
UPDATE lab l
SET cpt_recid = p.master_recid
FROM plan p
WHERE l.cpt_recid = p.recid AND
p.recid <> p.master_recid
)
DELETE FROM cpt c
USING plan p
WHERE c.cdesc LIKE '%excision/biopsy pathology%' AND
c.recid = p.recid AND
p.recid <> p.master_recid
RETURNING c.recid;