您的位置:首页 > 数据库

通过叶子节点,搜索所有父亲节点。最后再相加的sql语句。

2012-03-10 10:00 218 查看
WITH t1
AS (SELECT itemid,
name,
levelno,
superitemid
FROM   t_pubagency
WHERE  itemid IN (SELECT DISTINCT agency
FROM   t_fmvchrecordsfzc
WHERE  accountid=2273)),
t2
AS (SELECT itemid,
name,
levelno,
superitemid
FROM   t_pubagency
WHERE  itemid IN (SELECT superitemid
FROM   t1)),
t3
AS (SELECT itemid,
name,
levelno,
superitemid
FROM   t_pubagency
WHERE  itemid IN (SELECT superitemid
FROM   t2)),
t4
AS (SELECT itemid,
name,
levelno,
superitemid
FROM   t_pubagency
WHERE  itemid IN (SELECT superitemid
FROM   t3)),
t5
AS (SELECT itemid,
name,
levelno,
superitemid
FROM   t_pubagency
WHERE  itemid IN (SELECT superitemid
FROM   t4)) SELECT itemid  AS ID,
name    AS TEXT,
levelno AS JC
FROM   t1
UNION
SELECT itemid  AS ID,
name    AS TEXT,
levelno AS JC
FROM   t2
UNION
SELECT itemid  AS ID,
name    AS TEXT,
levelno AS JC
FROM   t3
UNION
SELECT itemid  AS ID,
name    AS TEXT,
levelno AS JC
FROM   t4
UNION
SELECT itemid  AS ID,
name    AS TEXT,
levelno AS JC
FROM   t5
ORDER  BY id


说明 t1选出所需要的叶子节点,t2为二级父节点,t3为三级父节点,t4为四级,t5为五级。

限制:有级次的限制,且代码比较长。

改进后:

WITH t1
AS (
select itemid, name,levelno ,superitemid
from   t_pubagency
where itemid IN (SELECT DISTINCT agency
FROM   t_fmvchrecordsfzc
WHERE  accountid=2273)),
),

t2 AS (
select itemid, name,levelno
from t_pubagency
start with itemid IN (select superitemid  from t1)
connect by prior superitemid=itemid order by code
)

SELECT itemid  AS ID,
name    AS TEXT,
levelno AS JC
FROM   t1
UNION
SELECT itemid  AS ID,
name    AS TEXT,
levelno AS JC
FROM   t2

order by id


改进后的方法中用到了,递归查询:

start with itemid IN (select superitemid from t1)

connect by prior superitemid=itemid order by code

大大减少了代码量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: