SQL 多级查询(级数不定)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 多级查询(级数不定)相关的知识,希望对你有一定的参考价值。

表结构:
1.item 实体表
itemID int PK 主键ID
Number varchar 编码(多级01 01.01 01.01.01 ...有下级的做为目录,无下级的做为实体)
parentID int FK(上级itemID,引用本表的itemID )
FDetail int (0为目录,1为实体)

例数据:
itemID Number parentID FDetail
1 01 0 0
2 01.01 1 0
3 01.01.01 2 1
4 01.01.02 2 1
5 02 0 0
6 02.02 5 0
7 02.02.01 6 1
8 02.02.02 6 1
9 01.02 1 0
10 01.03 1 0

表2 Inventory 库存表
itemID int FK 引用item[itemID]
qty demical 数量(只有实体才能写入此表)

例数据
itemID qty
3 50
8 20

需求:
以Inventory 表itemID为基本条件,查询item表相关的行及上级行
结果:
如果Inventory 存在itemID=3
那么需要查询出
实体:3 01.01.01 2 1
上级:2 01.01 1 0
上级:1 01 0 0

我的思路。
1。递归查询 但估计比较复杂
2。先查询对应的number然后用层级关系做模糊查询

请高手出马,能实现的话+50分起。
badkano和我写的思路一样
一.先查本体
二.利用substring做编码匹配,但用了len(Number)来动态截取,所以不必考虑到底分了几级.
不过badkano的方法里有一个优化的思路比较好,就是子级的ID肯定大于父级.这个我已经做为条件改到我的语句里了.能去掉不少的无用计算.

gis0123:
我看了你的代码,思路大体是这样
建一个@table
先查本级写入@,再循环加至根.

我的需求里,@itemID肯定是多条,ERP里查即时库存的,把存在物料层级关系取来做树型,
所以你的方面我可能要重写,直接select ..into @table 做临时表.
再用游标做层级加入,

明天我写一下,看看和我现在的方法哪个快...
估计小批的量的测试数据还看不出来哪个效率高...

各位再想想能不能有更好的方法?
主要是考虑如果数据量过大的话,这种动态匹配式查询会比较耗时间.

项目KO了,数据库查询还是用的代码匹配,加入树型直接用ItemID加Name属性做FIND/[0].谢谢各位.

select * from item where itemID=3 union all
select * from item where FDetail=0 and parentID <(select parentID from item where itemID=3)
and substring(Number,1,2) =(select substring(Number,1,2) from item where itemID=3)
and substring(Number,4,2) =(select substring(Number,4,2) from item where itemID=3);

说下思路,先把自己本身一条找出来,然后找他的上级,看你的数据知道parentID 一定小于本身的parentID ,并且是目录的话FDetail=0,如果是其上级目录,他们前边的01.01什么的都是一样的,但是现在有个弊端,就是查询前,要确定这个itemID=3的是属于第几级实体,然后才能采用后边用多少个substring,另一个表itemID=3的条件没用,其实就是一个嵌套,你自己写里边吧
参考技术A 如果是oracle 10g

select * from (select a.*,b.qty from item a left join Inventory b on a.itemID=b.itemID)

start with itemID=1--从哪个ID开始

connect by prior itemID= parentID ;--父找子

--
select * from (select a.*,b.qty from item a left join Inventory b on a.itemID=b.itemID )

start with itemID=1--从哪个ID开始

connect by prior parentID = itemID;--子找父
参考技术B @itemid--输入的变量(实体ID)

declare @taba TABLE([itemID] [int] NOT NULL,Number [varchar(100)] NOT NULL,parentID [int] NOT NULL,FDetail [int] NOT NULL)
declare @pid int--父ID
insert into @taba (itemID,Number,parentID,FDetail)
select itemID,Number,parentID,FDetail from item where itemID=@itemid--取出当前行
select @pid=parentID where itemID=@itemid--取出当前行父ID
while(exists(select top 1 * from item where itemID=@pid))
begin
insert into @taba (itemID,Number,parentID,FDetail)
select itemID,Number,parentID,FDetail from item where itemID=@pid--将父行插入
select @pid=parentID where itemID=@pid--再将父行的父ID插入,一直往上循环,直到查到没有父行为止
end
---手写的,可能有些错误,调试一下即可,这是变量表无限级循环,适合所有无限级分类表,更改一下也可以往下查无限级,
---哈哈,给分吧,70分哦,好多,以上各位的方法感觉是走入了死胡同
--变量表中的数据就是你要的数据
参考技术C --查上级
with sub as(
select itemID,Number,parentID from item where itemID=3
union all
select a.itemID,a.Number,a.parentID from item a,sub b
where a.itemID=b.parentID
)
select * from sub

查下级
with sub as(
select itemID,Number,parentID from item where itemID=3
union all
select a.itemID,a.Number,a.parentID from item a,sub b
where a.parentID=b.itemID
)
select * from sub

kettle----功能点用法总结(不定期更新)

表输入(从指定的数据库中,读取所查询表的数据)

截图如下:

技术分享图片

允许简易转换:

替换SQL语句里的变量:

从步骤插入数据:

 

以上是关于SQL 多级查询(级数不定)的主要内容,如果未能解决你的问题,请参考以下文章

[MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)

拉普拉斯局部极限定理怎么计算

Google BigQuery 中的多级数据透视

word2010中如何设置多级编号

顶级架构 -PB级数据实时查询,滴滴Elasticsearch多集群架构实践

顶级架构 -PB级数据实时查询,滴滴Elasticsearch多集群架构实践