楼主: newkid

用CTE实现层次查询

[复制链接]
论坛徽章:
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
11#
 楼主| 发表于 2021-9-1 21:29 | 只看该作者
我猜测是 NULL 在 UNION 的时候除了问题。把第一层的 NULL 改掉:

select id,' ',' ',' ',1,id
  from test
where pid is null

两个引号之间放一个空格。这样试试看。

使用道具 举报

回复
论坛徽章:
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
12#
发表于 2021-9-2 08:14 | 只看该作者
只是甲 发表于 2021-9-1 18:06
一样的结果,因为之前的没输出,我才改的

至少pid是对的,你改的在postgresql上pid是错的

使用道具 举报

回复
论坛徽章:
18
山治
日期:2017-01-11 16:13:26妮可·罗宾
日期:2020-09-01 08:52:07秀才
日期:2018-01-02 10:32:00技术图书徽章
日期:2017-08-23 14:17:00技术图书徽章
日期:2017-08-23 14:17:00秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05
13#
发表于 2021-9-2 10:26 | 只看该作者
newkid 发表于 2021-9-1 21:29
我猜测是 NULL 在 UNION 的时候除了问题。把第一层的 NULL 改掉:select id,' ',' ',' ',1,id  from testwh ...

多谢newkid大哥
之前猜测过是null的问题,就改成了'' 空字符串,没想到还需要加空格

测试了''  中间加一个空格是不对的,要加2个,我的mysql8的字符集是utf8mb4

'' 加一个空格,只输出一个中文



'' 加两个空格,输出正常




'' 加两个空格,将"广西"改为"西",将"福田"改为"福田区",输出正常



TT截图未命名_1.jpg (32.83 KB, 下载次数: 21)

两个空格三个中文字符

两个空格三个中文字符

TT截图未命名_2.jpg (33.4 KB, 下载次数: 17)

两个空格

两个空格

TT截图未命名_3.jpg (32.66 KB, 下载次数: 17)

一个空格

一个空格

使用道具 举报

回复
论坛徽章:
18
山治
日期:2017-01-11 16:13:26妮可·罗宾
日期:2020-09-01 08:52:07秀才
日期:2018-01-02 10:32:00技术图书徽章
日期:2017-08-23 14:17:00技术图书徽章
日期:2017-08-23 14:17:00秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05
14#
发表于 2021-9-2 10:30 | 只看该作者
上一楼  " '' 加一个空格,只输出一个中文"    和    "两个空格三个中文字符"   图片备注标反了,退回编辑发现编辑不了,这里备注一下

使用道具 举报

回复
论坛徽章:
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
15#
 楼主| 发表于 2021-9-2 22:05 | 只看该作者
看来是第一层的长度限制了整个输出的长度,把NULL变成 CAST(NULL AS VARCHAR2(20)) 试试。

使用道具 举报

回复
论坛徽章:
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#
发表于 2021-9-2 22:43 来自手机 | 只看该作者
长度看来是Oracle 的cte产品统一的毛病

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
17#
发表于 2021-9-3 20:06 | 只看该作者
〇〇 发表于 2021-9-2 22:43
长度看来是Oracle 的cte产品统一的毛病

C1,C2,C3的格式有点不一样,还可以这样

SQL>
SQL> select pid,id,level lvl,
  2         connect_by_root(id) root,
  3         prior pid c1,
  4         pid c2,
  5         id c3
  6    from test t
  7  connect by prior t.id = t.pid
  8  start with t.pid is null
  9  /

PID                  ID                          LVL ROOT                 C1                   C2                   C3
-------------------- -------------------- ---------- -------------------- -------------------- -------------------- --------------------
                     中国                          1 中国                                                           中国
中国                 广东                          2 中国                                      中国                 广东
广东                 深圳                          3 中国                 中国                 广东                 深圳
深圳                 福田                          4 中国                 广东                 深圳                 福田
中国                 广西                          2 中国                                      中国                 广西

使用道具 举报

回复
论坛徽章:
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#
 楼主| 发表于 2021-9-3 21:51 | 只看该作者
solomon_007 发表于 2021-9-3 20:06
C1,C2,C3的格式有点不一样,还可以这样SQL> SQL> select pid,id,level lvl,  2         connect_by_root(id ...

你能这么做是因为输出恰好才三层再加上ROOT,再多了就不灵了。

最近又搞ORACLE了吗?

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
19#
发表于 2021-9-4 09:57 | 只看该作者
newkid 发表于 2021-9-3 21:51
你能这么做是因为输出恰好才三层再加上ROOT,再多了就不灵了。最近又搞ORACLE了吗?

是的,还是搞老一套最顺手

使用道具 举报

回复
论坛徽章:
59
优秀写手
日期:2015-02-12 06:00:132016猴年福章
日期:2016-02-23 09:58:34猴赛雷
日期:2016-02-23 10:04:24紫水晶
日期:2016-04-01 12:19:28双子座
日期:2016-04-28 10:19:29秀才
日期:2016-06-23 14:15:06奥运会纪念徽章:曲棍球
日期:2016-08-30 13:12:24奥运会纪念徽章:体操
日期:2016-09-26 11:24:37妮可·罗宾
日期:2016-10-25 13:54:46娜美
日期:2017-04-28 10:45:33
20#
发表于 2021-9-8 17:50 | 只看该作者
在oracle里cte跟connect by很简单就能搞定的逻辑,在hive或者spark的sql就搞不定,哎

使用道具 举报

回复

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

本版积分规则 发表回复

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