【DB2】国标行业分类存储,通过SQL查询出层级关系
新建表
DROP TABLE Industry;
CREATE TABLE Industry(
IndustryCode VARCHAR(40),IndustryName VARCHAR(100),ParentID VARCHAR(40)
)
数据截图:

现在数据是这个样子的,我们需要找出对应的层级关系,例如:

实现SQL如下:
SELECT
A.IndustryCode AS CLASS01,A.INDUSTRYNAME CLASS_01NM,
B.IndustryCode AS CLASS02,B.INDUSTRYNAME CLASS_02NM,
C.IndustryCode AS CLASS03,C.INDUSTRYNAME CLASS_03NM,
C.IndustryCode AS CLASS04,C.INDUSTRYNAME CLASS_04NM,
DENSE_RANK() over(ORDER BY A.INDUSTRYCODE) SEQ
FROM Industry A,Industry B,Industry C,Industry D
WHERE A.INDUSTRYCODE=B.PARENTID AND B.INDUSTRYCODE=C.PARENTID AND C.INDUSTRYCODE=D.PARENTID and length(A.IndustryCode)=1
特别说明:
如果说存在越级维那么上述SQL则会出现问题
【内连接】
WITH DT(VALUE,NAME,PARENT)
AS
(
SELECT 'A','中国',NULL FROM SYSIBM.DUAL UNION ALL
SELECT 'A01','北京','A' FROM SYSIBM.DUAL UNION ALL
SELECT 'A02','云南','A' FROM SYSIBM.DUAL UNION ALL
SELECT 'A011','昆明','A02' FROM SYSIBM.DUAL UNION ALL
SELECT 'AA12','曲靖','A02' FROM SYSIBM.DUAL
) SELECT A.VALUE AVALUE,A.NAME ANAME,B.VALUE BVALUE,B.NAME BNAME FROM DT A,DT B WHERE A.VALUE=B.PARENT
AND LENGTH(A.VALUE)='3'
运行结果

【左连接】
WITH DT(VALUE,NAME,PARENT)
AS
(
SELECT 'A','中国',NULL FROM SYSIBM.DUAL UNION ALL
SELECT 'A01','北京','A' FROM SYSIBM.DUAL UNION ALL
SELECT 'A02','云南','A' FROM SYSIBM.DUAL UNION ALL
SELECT 'A011','昆明','A02' FROM SYSIBM.DUAL UNION ALL
SELECT 'AA12','曲靖','A02' FROM SYSIBM.DUAL
) SELECT A.VALUE AVALUE,A.NAME ANAME,B.VALUE BVALUE,B.NAME BNAME
FROM DT A LEFT JOIN DT B ON A.VALUE=B.PARENT
WHERE LENGTH(A.VALUE)='3'

由此可见,最好使用左连接,不然层级出现越级维的时候就会出现数据缺失。
【DB2】国标行业分类存储,通过SQL查询出层级关系的更多相关文章
- MySQL GROUP_CONCAT函数使用示例:如何用一个SQL查询出一个班级各个学科第N名是谁?
如何用一个SQL查询出一个班级各个学科第N名是谁? 首先贴出建表语句,方便大家本地测试: -- 建表语句 CREATE TABLE score ( id INT NOT NULL auto_incre ...
- 如何将sql查询出的列名用注释代替?
如何将sql查询出的列名用注释代替? 大家正常的工作的时候,会有这样的要求,客户想要看下原始数据,但是呢.前台导出又麻烦,这时候只能从数据库拷贝出来一份.但是呢,数据库里面的字段客户又看不明白,只能用 ...
- mybatis查询无结果, 数据库运行相同sql查询出结果
一.问题描述 mybatis查询无结果, 数据库运行相同sql查询出结果, 如下 这是数据库记录 这是mybatis查询出的结果, 记录条数0 这是直接将控制台一模一样的sql查询语句放到Navica ...
- SQL查询出某字段不等于某值的行(其中有为NULL的字段)
表1如下:TBD1100 TBD1101 TBD1102------------------------------------------ 1001 水果 ...
- SQL查询出每门课都大于80 分的学生姓名
Course表如下: 查询出每门课都大于80 分的学生姓名有两种方法. 1.select distinct name from Course where name not in (select di ...
- SQL查询出一个表数据插入到另一个表里
下面两中方式都是将 srcTbl 的数据插入到 destTbl,但两句又有区别的: 方式一 (select into from)要求目标表(destTbl)不存在,因为在插入时会自动创建. selec ...
- sql——查询出表中不为空或为空字段的总值数
查询所给的表中值为空的总数 判断字段是否为空的sql语句 SELECT sex FROM id where sex is not NULL SELECT COUNT(*) t FROM id wher ...
- 一个SQL查询出每门课程的成绩都大于80的学生姓名
name kecheng fenshu 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 ...
- SQL查询无限层级结构的所有下级,所有上级
无限层级结构的table1表,Id(主键),ParentId(父级id)查询某个Id的所有下级或所有上级,使用WITH AS,UNION ALL 查询 1.查询Id为1所有的下级 WITH T AS( ...
随机推荐
- Tomcat的类加载机制
一个功能健全的Web服务器,要解决如下几个问题: 部署在同一个服务器上的两个Web应用程序使用的Java 类库可以实现相互隔离.不能要求一个类库在一个服务器中只有一份,服务器应当保证两个应用程序的类 ...
- ionic 之环境的搭建
在ionic的学习中,首先要做的就是环境的搭建,接下来我对从一开始环境的搭建做了记录,以及过程中遇到的问题. 1.安装环境 1.1 安装Node.js Node.js建议安装最新版本,下载地址:htt ...
- 洛谷 P2689 东南西北【模拟/搜索】
题目描述 给出起点和终点的坐标及接下来T个时刻的风向(东南西北),每次可以选择顺风偏移1个单位或者停在原地.求到达终点的最少时间. 如果无法偏移至终点,输出“-1”. 输入输出格式 输入格式: 第一行 ...
- 01、Mecanim动画系统
序言:Mecanim动画系统是Unity4.0之后退出的新版动画系统,非常适合人类动画系统.本文是作为自己的学习来讲解的, 可能会有些啰嗦,但尽量把自己的坑都为大家列出来,让大家理解透彻. 一.文件的 ...
- sed 很棒的介绍
选项与参数:-n :使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上.但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作) ...
- mysql 列转行,合并字段的方法
数据表(表名:xsk) +----+------+-----------+-------+ | id | name| course | score | +----+------+----------- ...
- ubuntu 进入 pycharm(社区版)
先进入到pycharm所在的目录,然后进入bin 然后./pycharm.sh 例如,我把pycharm 放在桌面上 su ➜ xushukui cd '/home/xushukui/桌面/pycha ...
- 【带修莫队】bzoj2120 数颜色
块大小为n2/3. 把询问和修改分开. 每次两个询问之间的修改进行暴力转移,如果修改在上一次询问的区间里,就会对当前状态形成影响. 好慢. #include<cstdio> #includ ...
- 【进制转换】CODEVS 1740 进制计算器
#include<cstdio> #include<iostream> #include<string> using namespace std; string s ...
- Java学习笔记(6)
java是面向对象的语言. 对象:真实存在的唯一的事物. 类:实际就是对某种类型事物的共性属性与行为的抽取 面向对象的计算机语言的核心思想:找适合的对象做适合的事情. 如何找适合的对象呢: 1.sun ...