VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 658|回复: 4

问;无限分类的sql语句的写法

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-2 11:00:02 | 显示全部楼层 |阅读模式
有个表
id    belongToId
==    ================
1     2
2     3
3     4
4     5

怎样select的结果是1,2,3,4,5

也就是用户给个id是1...把属于他的所有的子id都给select出来
回复

使用道具 举报

0

主题

12

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-3-19 23:45:01 | 显示全部楼层
参考:

--生成测试数据
create table BOM(ID VARCHAR(10),PID VARCHAR(10))
insert into BOM select 'a',NULL
insert into BOM select 'b','a'
insert into BOM select 'c','a'
insert into BOM select 'd','b'
insert into BOM select 'e','b'
insert into BOM select 'f','c'
insert into BOM select 'g','c'
go

--创建用户定义函数
create function f_getChild(@ID VARCHAR(10))
returns varchar(8000)
as
begin
    declare @i int,@ret varchar(8000)
    declare @t table(ID VARCHAR(10),PID VARCHAR(10),Level INT)
    set @i = 1
    insert into @t select ID,PID,@i from BOM where PID = @ID
   
    while @@rowcount<>0
    begin
        set @i = @i + 1
        
        insert into @t
        select
            a.ID,a.PID,@i
        from
            BOM a,@t b
        where
            a.PID=b.ID and b.Level = @i-1
    end
   
    select @ret = isnull(@ret,'')+ID from @t
   
    return @ret
end
go

--执行查询
select ID,isnull(dbo.f_getChild(ID),'') from BOM group by ID
go

--输出结果
/*
a    bcdefg
b    de
c    fg
d   
e   
f   
g   
*/

--删除测试数据
drop function f_getChild
drop table BOM
回复

使用道具 举报

0

主题

126

帖子

73.00

积分

新手上路

Rank: 1

积分
73.00
发表于 2020-3-22 09:00:02 | 显示全部楼层
create table TESTTAB(
id  int,
belongToId  int
)
GO

insert into TESTTAB(id,belongToId)
            select 1,2
UNION ALL   select 2,3
UNION ALL   select 3,4
UNION ALL   select 4,5
GO

DECLARE @RESULTSTR VARCHAR(4000)
DECLARE @CUR_LV    INT
DECLARE @LAST_LV    INT

SELECT @CUR_LV=1    --此处为入口
SELECT @LAST_LV=0
SELECT @RESULTSTR=RTRIM(CAST (@CUR_LV AS CHAR(3)))
WHILE @LAST_LV<>@CUR_LV
BEGIN
    SELECT @LAST_LV=@CUR_LV
    SELECT @RESULTSTR=@RESULTSTR+','+RTRIM(CAST (belongToId AS CHAR(3))),@CUR_LV=belongToId
         FROM TESTTAB WHERE id=@CUR_LV
END

SELECT @RESULTSTR

---------------------
1,2,3,4,5

(1 行受影响)
回复

使用道具 举报

0

主题

126

帖子

73.00

积分

新手上路

Rank: 1

积分
73.00
发表于 2020-3-22 19:00:01 | 显示全部楼层

CREATE FUNCTION GET_ALLLV(@LV INT)
returns varchar(8000)
as
BEGIN
    DECLARE @RESULTSTR VARCHAR(4000)
    DECLARE @CUR_LV    INT
    DECLARE @LAST_LV    INT

    SELECT @CUR_LV=@LV    --此处为入口
    SELECT @LAST_LV=-1
    SELECT @RESULTSTR=RTRIM(CAST (@CUR_LV AS CHAR(3)))
    WHILE @LAST_LV<>@CUR_LV
    BEGIN
        SELECT @LAST_LV=@CUR_LV
        SELECT @RESULTSTR=@RESULTSTR+','+RTRIM(CAST (belongToId AS CHAR(3))),@CUR_LV=belongToId
             FROM TESTTAB WHERE id=@CUR_LV
    END
    RETURN @RESULTSTR
END
GO

SELECT id,dbo.GET_ALLLV(id) FROM TESTTAB

id         
--------------------------------
1           1,2,3,4,5
2           2,3,4,5
3           3,4,5
4           4,5

(4 行受影响)
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-3-24 19:15:01 | 显示全部楼层
哈哈。。正是我想要的。。。。一点也不多。一点也不少。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表