sql语句 条件循环查询

来源:百度知道 编辑:UC知道 时间:2024/05/08 11:31:58
有一个产品分类表,由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,不过还是要多谢你了。栽培者 - 总监 八级 :多谢你的指导,但我感觉好复杂哦。呵呵,等下也研究一下吧,多谢了!

补充:
按照你的意思改了一下,把找出的所有记录中,没有子结点(也就是叶子)的记录显示出来。

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

对于这样的编号,单条SQL语句无法实现,建议采用SQL的自定义函数来实现,以下给出简单的示例代码:
/*
创建一个自定义函数,功能为返回指定ID的所有子项
参数:
@intParentId 当前要取值的编号
@bitShowParent 是否显示当前编号的记录,默认不显示
*/
CREATE FUNCTION fnGetChild(
@intParentId int,@bitShowParent bit=0
)RETURNS @tabReturn TABLE([id] int,[name] varchar(20),[Level] int)
AS