第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
你的数据库结构设计得不好,,效率会很低,建议你重新再设吧,不要继续埋头下去了,如果不是无限级的,建议就直接定死各层级好了