sql语句 条件循环查询

有一个产品分类表,由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
温馨提示:答案为网友推荐,仅供参考
第1个回答  2006-10-18
对于这样的编号,单条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)
第2个回答  2006-10-17
假设这个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

我感觉还是他这个好点,
写的比较详细点,
第3个回答  2006-10-17
select * from table where parentID=@ID
这是这个ID的所有下级的
如果要找最下级最好在程序代码中做或者改一下表结构
第4个回答  2006-10-17
这个好像很难啊,这个ID有没有直接指向最底层的ID??或者最底层的ID有没有直接指向这个ID的项?
如果没有就很复杂啊。
你只能一层一层的查下去
第5个回答  2006-10-17
你的数据库结构设计得不好,,效率会很低,建议你重新再设吧,不要继续埋头下去了,如果不是无限级的,建议就直接定死各层级好了