递归SELECT查询返回任意深度的速率?

时间:2013-12-15 10:07:09

标签: sql postgresql common-table-expression recursive-query

这是我第一次尝试递归SQL查询向上遍历N个父子关系,我不知道从哪里开始。任何帮助将不胜感激。

情景是我有两个表 - raterate_plan。费率属于适用于用户的费率计划。

CREATE TERM rate_plan (
   id                  integer PRIMARY KEY NOT NULL
                       DEFAULT nextval('rate_plan_id'),

   descr               varchar(64) NOT NULL,

   parent_rate_plan_id integer NOT NULL REFERENCES rate_plan(id)
);

CREATE TABLE rate (
   id                integer PRIMARY KEY NOT NULL
                     DEFAULT nextval('rate_id'),

   prefix            varchar(24) NOT NULL,

   rate_plan_id      integer NOT NULL 
                     REFERENCES rate_plan(id)
);

获得费率的典型查询:

SELECT * FROM rate  
   WHERE (
      rate_plan_id = ${user rate plan ID} 
      AND prefix = ${prefix}
   )
   ORDER BY LENGTH(prefix) ASC;

我想要的是返回最具体的(LENGTH() - iest前缀)费率,但不仅限于${user rate plan ID},而是选择与任意数量的费率计划相关的费率在rate_plan.parent_rate_plan_id层次结构中。递归应该在rate_plan.parent_rate_plan_id = NULL

时触底

我只会做一个JOIN,但我需要容纳N个父子关系,而不仅仅是两个。

这是在PostgreSQL 9.x上。我尝试了WITH RECURSIVEUNION ALL,并在每个rate_plan加入rateSELECT并尝试按父级过滤,但由于对这些结构如何运作。

1 个答案:

答案 0 :(得分:2)

根据您的描述,这可能是您正在寻找的东西:

  

最具体的(LENGTH() - iest前缀)费率,但不受限制   转到${user rate plan ID},而是从附属的

中选择费率
WITH RECURSIVE cte AS (
   SELECT id, parent_rate_plan_id
   FROM   rate_plan  
   WHERE  id = ${user rate plan ID} 

   UNION ALL
   SELECT rp.id, rp.parent_rate_plan_id
   FROM   cte
   JOIN   rate_plan rp ON rp.id = cte.parent_rate_plan_id
   )
SELECT *
FROM   cte
JOIN   rate r ON r.rate_plan_id = cte.id
ODER   BY length(prefix) DESC
LIMIT  1;

一旦到达顶部节点(parent_rate_plan_id IS NULL),递归就会自动停止。

收集完所有计划后,加入rate会更有效。

The manual on (recursive) CTEs.