这是我第一次尝试递归SQL查询向上遍历N个父子关系,我不知道从哪里开始。任何帮助将不胜感激。
情景是我有两个表 - rate
和rate_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 RECURSIVE
和UNION ALL
,并在每个rate_plan
加入rate
到SELECT
并尝试按父级过滤,但由于对这些结构如何运作。
答案 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
会更有效。