SQL 多级查询(级数不定)
表结构:1.item实体表itemIDintPK主键IDNumbervarchar编码(多级0101.0101.01.01...有下级的做为目录,无下级的做为实体)par...
表结构:
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].谢谢各位. 展开
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].谢谢各位. 展开
4个回答
展开全部
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的条件没用,其实就是一个嵌套,你自己写里边吧
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的条件没用,其实就是一个嵌套,你自己写里边吧
展开全部
如果是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;--子找父
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;--子找父
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
@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分哦,好多,以上各位的方法感觉是走入了死胡同
--变量表中的数据就是你要的数据
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分哦,好多,以上各位的方法感觉是走入了死胡同
--变量表中的数据就是你要的数据
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
--查上级
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
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询