sql语句 条件循环查询

有一个产品分类表,由id,name(分类名称),parentID(上一级别ID,第一级为0),最多有四级,但也有些只有二级或三级,现只给出一个ID,但不知是哪级的,如何查... 有一个产品分类表,由id,name(分类名称),parentID(上一级别ID,第一级为0),最多有四级,但也有些只有二级或三级,现只给出一个ID,但不知是哪级的,如何查出这个ID的所有最底层子ID(即属于它的所有的最底层的ID)。求各位SQL高手赐教,谢谢了!!
不知我表达的够清楚没有。
可是我只要最底层的ID啊,(abingpow 总监 八级 )把它全部的ID都取出来了,如:ID为第一级的话就会把二、三、四级的ID都取出来了。大家有没有更好的建议啊,数据库是别人以前做的,里面有好多客户的数据了,不能改了,数据库Product(产品)表里只有一个字段(P_listID)指向category(产品分类)表里的最底层的ID。

多谢名位的指导。我对SQL不是很熟,abingpow - 总监 八级 :有些ID的最底层子ID并不一定在同一级别啊,比如6为第一级的,它的最底层子ID有些是第三级的,有些是第四级的,你的只能得到级数最大的(如四级)的ID,不过还是要多谢你了。栽培者 - 总监 八级 :多谢你的指导,但我感觉好复杂哦。呵呵,等下也研究一下吧,多谢了!
展开
 我来答
abingpow
2006-10-18 · TA获得超过2206个赞
知道大有可为答主
回答量:2830
采纳率:0%
帮助的人:2271万
展开全部
补充:
按照你的意含碰清思谈前改了一下,把找出的所有记录中吵嫌,没有子结点(也就是叶子)的记录显示出来。

select * into #tmp from (
(select * from ywb_zd where id=6)
union all
(select * from ywb_zd where parentID in (select id from ywb_zd where id=6))
union all
(select * from ywb_zd where parentID in (select id from ywb_zd where parentID in (select id from ywb_zd where id=6)))
union all
(select * from ywb_zd where parentID in (select id from ywb_zd where parentID in (select id from ywb_zd where parentID in (select id from ywb_zd where id=6))))
)x
select * from #tmp a where not exists(select * from #tmp where parentID=a.id)
drop table #tmp
栽培者
2006-10-18 · TA获得超过1067个赞
知道小有建树答主
回答量:746
采纳率:0%
帮助的人:767万
展开全部
对于这样的编号,单条SQL语句衡肆无法实现,建议采用SQL的自定义函数来实现,以下给出简单的示例代码:
/*
创建一个自定义函数,功能为返回指定ID的所有子昌哪项
参数:
@intParentId 当前要取值的编号
@bitShowParent 是否显示当前编号的记录,默认不显示
*/
CREATE FUNCTION fnGetChild(
@intParentId int,@bitShowParent bit=0
)RETURNS @tabReturn TABLE([id] int,[name] varchar(20),[Level] int)
AS
BEGIN
-- 当前级别
DECLARE @intLevel int
SET @intLevel=1

-- 判断是否显示当前编号的记录
IF @bitShowParent = 1
INSERT @tabReturn SELECT [id],[name],0 FROM 产品分类表 WHERE [id]=@intParentId

-- 将上级编号为 @intParentId 的记录插入耐拦码到要返回的表
INSERT @tabReturn SELECT [id],[name],@intLevel FROM 产品分类表 WHERE parentID=@intParentId

WHILE @@ROWCOUNT > 0
BEGIN
SET @intLevel = @intLevel + 1
INSERT @tabReturn SELECT S.[id],S.[name],@intLevel
FROM 产品分类表 S,@tabReturn R
WHERE S.parentID=R.id AND R.Level = @intLevel -1
END
RETURN
END

执行以上代码,然后就可以用以下语句调用了:
-- 显示编号为 1 的所有记录,包含自身。
SELECT * FROM dbo.fnGetChild(1,1)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
爱个人好辛苦
2006-10-17 · TA获得超过229个赞
知道小有建树答主
回答量:839
采纳率:0%
帮助的人:291万
展开全部
假设这个ID为6,则执行以下语句(以下语句支答乱持到4级,可以雀举前根据需要增减,语句应该还算比较简单的吧)

(select 1 as level,* from ywb_zd where id=6)
union all
(select 2 as level,* from ywb_zd where parentID in (select id from ywb_zd where id=6))
union all
(select 3 as level,* from ywb_zd where parentID in (select id from ywb_zd where parentID in (select id from ywb_zd where id=6)))
union all
(select 4 as level,* from ywb_zd where parentID in (select id from ywb_zd where parentID in (select id from ywb_zd where parentID in (select id from ywb_zd where id=6))))
回答者:顷清abingpow - 总监 八级 10-17 17:46

我感觉还是他这个好点,
写的比较详细点,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
呼沛槐0R
2006-10-17 · TA获得超过2661个赞
知道大有可为答主
回答量:2135
采纳率:0%
帮助的人:2661万
展开全部
select * from table where parentID=@ID
这是这肢孙卖个ID的所有下级的
如果凯行要找最下级最好在程序代码中做或者改一下历逗表结构
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mo_rex
2006-10-17 · TA获得超过110个赞
知道小有建树答主
回答量:761
采纳率:0%
帮助的人:476万
展开全部
这个好像很难啊,这个ID有没有直接指向最底者弯层的ID?吵嫌睁?或者最底层的ID有没有直接升岁指向这个ID的项?
如果没有就很复杂啊。
你只能一层一层的查下去
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友998a16a
2006-10-17 · TA获得超过202个赞
知道小有建树答主
回答量:279
采纳率:0%
帮助的人:328万
展开全部
你的数散姿据库结构设计得不好,,效率会很低,建议雹没你重新再设吧,不要继续埋头下去了,如果不是无限级的,源掘纳建议就直接定死各层级好了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式