楼主: kylemo

[SQL] 求一个递归查询SQL

[复制链接]
论坛徽章:
0
11#
 楼主| 发表于 2017-5-3 09:31 | 只看该作者
我写一个,抛砖引玉,只实现相邻两级的记录替换,夸级的还没实现
  1. WITH X AS
  2. (SELECT '1' AS id, '1' AS pid, 'TEST' AS treeNm, '李明' AS userName FROM dual
  3.   UNION
  4.   SELECT '2' AS id, '1' AS pid, 'TEST\AA' AS treeNm, '李华' AS userName  FROM dual
  5.   UNION
  6.   SELECT '3' AS id, '2' AS pid, 'TEST\AA\BB' AS treeNm, '何思可' AS userName  FROM dual
  7.   UNION
  8.   SELECT '4' AS id, '3' AS pid, 'TEST\AA\BB\CC' AS treeNm, '何思可' AS userName  FROM dual
  9.   UNION
  10.   SELECT '5' AS id, '3' AS pid, 'TEST\AA\BB\DD' AS treeNm, '吴小明' AS userName FROM dual
  11.   UNION
  12.   SELECT '6' AS id, '4' AS pid, 'TEST\AA\BB\DD\EE' AS treeNm,  '吴小明' AS userName FROM dual
  13.   UNION
  14.   SELECT '7' AS id, '4' AS pid, 'TEST\AA\BB\DD\JJ11' AS treeNm, '吴小明' AS userName FROM dual
  15.   UNION
  16.   SELECT '8' AS id,'4' AS pid, 'TEST\AA\BB\DD\EE22' AS treeNm, '吴小明' AS userName FROM dual),

  17. Y AS
  18. (SELECT t.*,
  19.          CASE
  20.            WHEN (SELECT USERNAME
  21.                    FROM X a
  22.                   WHERE a.pid = t.pid - 1
  23.                     AND ROWNUM = 1) = t.USERNAME THEN
  24.             (SELECT USERNAME
  25.                FROM X a
  26.               WHERE a.pid = t.pid - 2
  27.                 AND ROWNUM = 1)
  28.            ELSE
  29.             t.USERNAME
  30.          END AS USERNAME_C
  31.     FROM X t)
  32. SELECT * FROM Y
复制代码

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2016-11-25 16:52:36
12#
发表于 2017-5-3 10:45 | 只看该作者
“例如1:当取到当前记录是第3条时,username为何思可,其上一级(第2条记录)为李华,则不需要变更;当取当第4要记录时,username为何思可,其上一级(第3条记录)也是何思可,
则需要变更为(第2条记录)李华;例如2:当前记录为第8条时,其username应该变更为何思可(直到找不同的值为止)”

直接被绕晕了。。。为什么当前记录是第3条时,不用变更;当记录是第8条时,又要变更了呢??
第3和第8条的上一级和该行记录的username都不相同啊

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
13#
发表于 2017-5-3 11:01 | 只看该作者
把每个人对应的最小pid求出来,然后把上级用户名与此关联,找到这个pid的上层

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
14#
发表于 2017-5-3 11:12 | 只看该作者
你把示例数据每一行需要查出的结果都贴出来

使用道具 举报

回复
论坛徽章:
0
15#
 楼主| 发表于 2017-5-3 12:09 | 只看该作者
抱歉啊,这是最终的结果:
ID        PID        TREENM                         USERNAME               USERNAME_C
1        1        TEST                           李明                        李明
2        1        TEST\AA                         李华                       李华
3        2        TEST\AA\BB                何思可               何思可
4        3        TEST\AA\BB\CC                何思可               李华
5        3        TEST\AA\BB\DD                吴小明              何思可
6        4        TEST\AA\BB\DD\EE        吴小明              何思可
7        4        TEST\AA\BB\DD\JJ11        吴小明              何思可
8        4        TEST\AA\BB\DD\EE22        吴小明             何思可

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
16#
发表于 2017-5-3 13:15 | 只看该作者
kylemo 发表于 2017-5-3 12:09
抱歉啊,这是最终的结果:
ID        PID        TREENM                         USERNAME               USERNAME_C
1        1        TEST        ...

3        2        TEST\AA\BB                何思可               何思可
怎么解释

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
17#
发表于 2017-5-3 14:16 | 只看该作者
〇〇 发表于 2017-5-3 13:15
3        2        TEST\AA\BB                何思可               何思可
怎么解释

同问。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
18#
发表于 2017-5-3 23:29 | 只看该作者
就是说,任何相邻两级的名字不能相同?
如果儿子和孙子同名,那么就把孙子改成爷爷名字?
如果曾孙子本来也是爷爷的名字,也就是曾孙子和孙子本来不同名,那么孙子改成爷爷以后变得和曾孙子同名了,怎么办?

使用道具 举报

回复
论坛徽章:
0
19#
 楼主| 发表于 2017-5-4 12:09 | 只看该作者
newkid 发表于 2017-5-3 23:29
就是说,任何相邻两级的名字不能相同?
如果儿子和孙子同名,那么就把孙子改成爷爷名字?
如果曾孙子本来 ...

1、任何相邻两级的名字不能相同 是的
2、如果儿子和孙子同名,那么就把孙子改成爷爷名字?
3、如果曾孙子本来也是爷爷的名字,也就是曾孙子和孙子本来不同名,那么孙子改成爷爷以后变得和曾孙子同名了,怎么办? 不需要理会修改后的同名

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2017-5-4 14:55 | 只看该作者
不知道有没有理解错楼主的意思
WITH X AS
(SELECT '1' AS id, '' AS pid, 'TEST' AS treeNm, '李明' AS userName FROM dual
  UNION
  SELECT '2' AS id, '1' AS pid, 'TEST\AA' AS treeNm, '何思可' AS userName  FROM dual
  UNION
  SELECT '3' AS id, '2' AS pid, 'TEST\AA\BB' AS treeNm, '何思可' AS userName  FROM dual
  UNION
  SELECT '4' AS id, '3' AS pid, 'TEST\AA\BB\CC' AS treeNm, '何思可' AS userName  FROM dual
  UNION
  SELECT '5' AS id, '3' AS pid, 'TEST\AA\BB\DD' AS treeNm, '吴小明' AS userName FROM dual
  UNION
  SELECT '6' AS id, '4' AS pid, 'TEST\AA\BB\DD\EE' AS treeNm,  '吴小明' AS userName FROM dual
  UNION
  SELECT '7' AS id, '4' AS pid, 'TEST\AA\BB\DD\JJ11' AS treeNm, '吴小明' AS userName FROM dual
  UNION
  SELECT '8' AS id,'4' AS pid, 'TEST\AA\BB\DD\EE22' AS treeNm, '何思可' AS userName FROM dual),
Y(
ID,PID,TREENM,USERNAME,USERNAME_C) AS
  (SELECT a.*,a.username username_c
   from x a
   where id=(SELECT min(pid) from x )
  UNION ALL
   SELECT x.ID,x.PID,x.TREENM,x.USERNAME,case when y.username=x.USERNAME then  y.username_c else y.username end username_c
   from y,x
   WHERE y.id=x.pid)
SELECT * FROM y  

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表