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].谢谢各位.
展开
 我来答
badkano
推荐于2016-07-15 · 知道合伙人体育行家
badkano
知道合伙人体育行家
采纳数:144776 获赞数:885366
团长

向TA提问 私信TA
展开全部
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的条件没用,其实就是一个嵌套,你自己写里边吧
百度网友07f2face2
2010-07-28 · TA获得超过283个赞
知道小有建树答主
回答量:382
采纳率:50%
帮助的人:137万
展开全部
如果是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;--子找父
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gis0123
2010-07-28 · TA获得超过462个赞
知道小有建树答主
回答量:364
采纳率:0%
帮助的人:125万
展开全部
@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分哦,好多,以上各位的方法感觉是走入了死胡同
--变量表中的数据就是你要的数据
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shutao917
2010-07-28 · TA获得超过1213个赞
知道大有可为答主
回答量:2199
采纳率:0%
帮助的人:3128万
展开全部
--查上级
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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式