表结构
create table branch
(
branchno varchar2(16), --机构号
name varchar2(64), --机构名称
levelid integer, --机构级别(1,2,3,4)
parentbranchno varchar2(16), --父机构号
primary key(branchno)
)查询结果
级别 机构名称 机构号 父机构
1 一级机构 9999
2 二级机构 1000 --它的父机构9999
3 三级机构 1100 --它的父机构时1000
3 三级机构 1200 --它的父机构时1000
4 四级机构 1210 --它的父机构时1200
2 二级机构 2000 --它的父机构9999
3 三级机构 2100 --它的父机构时2000
3 三级机构 2200 --它的父机构时2000请教各位大大,要得到这样的结果,sql语句怎么写?
谢谢,在线等
create table branch
(
branchno varchar2(16), --机构号
name varchar2(64), --机构名称
levelid integer, --机构级别(1,2,3,4)
parentbranchno varchar2(16), --父机构号
primary key(branchno)
)查询结果
级别 机构名称 机构号 父机构
1 一级机构 9999
2 二级机构 1000 --它的父机构9999
3 三级机构 1100 --它的父机构时1000
3 三级机构 1200 --它的父机构时1000
4 四级机构 1210 --它的父机构时1200
2 二级机构 2000 --它的父机构9999
3 三级机构 2100 --它的父机构时2000
3 三级机构 2200 --它的父机构时2000请教各位大大,要得到这样的结果,sql语句怎么写?
谢谢,在线等
select a.levelid ,a.name,a.branchno ,a.parentbranchno from branch a,branch b
where a.prantno(+)=b.no 你看看这句话对不?
| levelid | name | branchno | parentbranchno |
+---------+-------+----------+----------------+
| 1 | yiji | 9999 | NULL |
| 2 | erji | 1000 | 9999 |
| 3 | sanji | 1100 | 1000 |
| 3 | sanji | 1200 | 1000 |
+---------+-------+----------+----------------+
SQL> select * from t
2 order by decode(id,9999,to_number(null),id) nulls first;
ID
----------
9999
1000
1100
1200
1210
2000
2100
2200
8 rows selected
如果想要整个结果,那么把测试数据贴出来吧,不然还要自己根据你的结果拼测试数据比较烦
LEVELID NAME BRANCHNO PARENTBRANCHNO
1 一级 9999
3 三级 3700 3400
3 三级 5100 5199
3 三级 2900 3400
3 三级 2700 3400
3 三级 3600 3400
2 二级 3400 9999
2 二级 5199 9999
3 三级 0100 3400
3 三级 0200 3400
3 三级 0300 3400
3 三级 0400 3400
我查询出来像这样了,是不是因为9999机构的父机构这个字段没有值?
oracle中任何不加order by的都无法保证顺序,要有序必须加order by
select a.levelid ,a.name,a.branchno ,a.parentbranchno from branch a left join branch b on a.parentbranchno=b.branchno order by a.branchno 试试看
还有,你想怎么排序,大概描述下 。
LEVELID NAME BRANCHNO PARENTBRANCHNO
1 一级 9999
2 二级 5199 9999
3 三级 5100 5199
3 三级 3700 3400
3 三级 3600 3400
2 二级 3400 9999
3 三级 2900 3400
试了一下,得到的结果如上,5199机构的对了,3400机构的顺序不对
我想要的结果像这样
LEVELID NAME BRANCHNO PARENTBRANCHNO
1 一级 9999
2 二级 5199 9999
3 三级 5100 5199
2 二级 3400 9999
3 三级 3700 3400
3 三级 3600 3400
3 三级 2900 3400
树形结构:层次化查询,即树型结构查询,是SQL中经常用到的功能之一,通常由根节点,父节点,子节点,叶节点组成,其语法如下: SELECT [LEVEL] ,column,expression,... FROM table_name [WHERE where_clause] [[START WITH start_condition] [CONNECT BY PRIOR prior_condition]]; SELECT levelid,name,branchno,parentbranchno
FROM branch
START WITH branchno = 9999
CONNECT BY PRIOR branchno = parentbranchno
ORDER BY levelid,name,branchno,parentbranchno
更多:层次化查询(START BY ... CONNECT BY PRIOR)
看样子是需要oracle的树查询了,你上网看看,现在我这没测试环境
from branch
start with branchno=9999
connect by parentbranchno = prior branchno
select * from branch;
9999 一级 1
5199 二级 2 9999
5100 三级 3 5199
3400 二级 2 9999
3700 三级 3 3400
3600 三级 3 3400
2900 三级 3 3400
执行后的结果
select t.levelid,t.name,t.branchno,t.parentbranchno from branch t start with t.branchno='9999' connect by prior t.branchno=t.parentbranchno;
1 一级 9999
2 二级 5199 9999
3 三级 5100 5199
2 二级 3400 9999
3 三级 3700 3400
3 三级 3600 3400
3 三级 2900 3400
这个可以不?
已上是oracle测试结果
select 9999 branchno, '一级机构A' name, 1 levelid, null parentbranchno from dual union all
select 1000 branchno, '二级机构A' name, 2 levelid, 9999 parentbranchno from dual union all
select 1100 branchno, '三级机构A' name, 3 levelid, 1000 parentbranchno from dual union all
select 1200 branchno, '三级机构B' name, 3 levelid, 1000 parentbranchno from dual union all
select 1210 branchno, '四级机构A' name, 4 levelid, 1200 parentbranchno from dual union all
select 2000 branchno, '二级机构B' name, 2 levelid, 9999 parentbranchno from dual union all
select 2100 branchno, '三级机构C' name, 3 levelid, 2000 parentbranchno from dual union all
select 2200 branchno, '三级机构D' name, 3 levelid, 2000 parentbranchno from dual
)
select levelid, name, branchno, parentbranchno
from tree
start with parentbranchno is null
connect by prior branchno = parentbranchno