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

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


大大减少了代码量。

posted on 2012-03-10 10:00  chanya  阅读(763)  评论(0编辑  收藏  举报

导航