Database 在PostgreSQL中使用带有窗口分区和字符串模式匹配的CTE的困难

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

我试图扩展我对PostgreSQL 9.1使用的CTE和窗口分区的理解。我的另一个问题就是一个例子。情况是,cdesc是一个文本字段,以前的数据库中添加了不必要的字符,以保持每个cdesc文本条目的不同和唯一性

问题是如何组合表CPT中与切除/活检病理学字符串模式匹配的所有条目

这样做失败,因为计划正在对完整且唯一的cdesc进行分组,而不仅仅是匹配的部分:

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;