求一句SQL,100分问题!!!!!!!!!!!!!!!!!!!!!!!!!

learnall 2005-09-27 04:30:16
有这样的树型结构表

CID PID CODE
1 0 01
2 1 02
3 0 03
4 2 04
.....

CID 为子记录 ID
PID 为父节点 ID
CODE 为编码

请问如何用最简短的并且效率最高的SQL语句 得出下列结果:

CID CODE
1 01
2 01-02
3 03
4 01-02-04
......

最有效的SQL 分数全给! 谢谢大家
...全文
96 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang_yzy 2005-09-27
  • 打赏
  • 举报
回复
方法应该都大体相同吧,,
都需要用循环语句来连接赋值字符串吧
zjcxc 元老 2005-09-27
  • 打赏
  • 举报
回复
自定义函数的方法需要为每条记录跑一次它的所有父结点.

我的方法只需要对PID<>0的所有记录处理一次就行了.

如果你的子树嵌套较深, 用我的方法具有优势.

如果你的子树单纯是总记录数多, 嵌套的层次很浅,则应该考虑使用自定义函数的处理方式.(因为我的方法有临时表的开销, 不适宜于处理数据量特别大的表)
zjcxc 元老 2005-09-27
  • 打赏
  • 举报
回复
USE tempdb
GO

--生成测试数据
create table BOM(CID INT,PID INT,CODE VARCHAR(10))
insert into BOM select 1,0,'01'
insert into BOM select 2,1,'02'
insert into BOM select 3,0,'03'
insert into BOM select 4,2,'04'
go

SELECT CID,PID,CODE=CAST(CODE as varchar(8000))
INTO #
FROM BOM
UPDATE A SET
CODE=P.CODE+'-'+A.CODE
FROM # P, # A
WHERE P.PID=0
AND P.CID=A.PID
WHILE @@ROWCOUNT>0
UPDATE A SET
CODE=P.CODE+'-'+A.CODE
FROM # P, # A
WHERE P.CID=A.PID
AND CHARINDEX('-',P.CODE)>0
AND CHARINDEX('-',A.CODE)=0
SELECT CID,CODE FROM #
DROP TABLE #
go

drop table BOM

/*--结果

CID CODE
----------- ------------
1 01
2 01-02
3 03
4 01-02-04

(所影响的行数为 4 行)
--*/
wgsasd311 2005-09-27
  • 打赏
  • 举报
回复
@s=@s+'-'+code
=========>改为
@s=code+'-'+@s
就可以把显示的顺序倒过来了
wgsasd311 2005-09-27
  • 打赏
  • 举报
回复
drop function dbo.f_1
create table tb(CID INT,PID INT,CODE VARCHAR(10))
insert into tb select 1,0,'01'
insert into tb select 2,1,'02'
insert into tb select 3,0,'03'
insert into tb select 4,2,'04'
go
create function f_1(@cid int)
returns varchar(8000)
as
begin
declare @s varchar(8000)
set @s=''
select @s=@s+'-'+code,@cid=pid from tb where cid=@cid
while @@rowcount>0
begin
select @s=@s+'-'+code,@cid=pid from tb where cid=@cid
end
return stuff(@s,1,1,'')
end
go
select cid,[code]=dbo.f_1(cid) from tb
/*
cid code
----------- ------------
1 01
2 02-01
3 03
4 04-02-01

(所影响的行数为 4 行)

*/
vivianfdlpw 2005-09-27
  • 打赏
  • 举报
回复
create table A
(
CID int,
PID int,
CODE varchar(10)
)
insert A
select 1,0,'01' union
select 2,1,'02' union
select 3,0,'03' union
select 4,2,'04'
go

--创建函数
create function f_tb(@CID int)
returns @tb table(CID int,Code varchar(10))
as
begin
insert @tb select CID,Code from A where PID=@CID
while @@rowcount>0
begin
insert @tb
select A.CID
,B.Code+'-'+A.Code
from A
join @tb B on A.PID=B.CID
where A.CID not in(select CID from @tb)
end

return
end
go

--查询
select * from f_tb(0) order by CID

--删除测试环境
drop function f_tb
drop table A

--结果
/*
CID Code
----------- ----------
1 01
2 01-02
3 03
4 01-02-04

(所影响的行数为 4 行)
*/
子陌红尘 2005-09-27
  • 打赏
  • 举报
回复
--生成测试数据
create table BOM(CID INT,PID INT,CODE VARCHAR(10))
insert into BOM select 1,0,'01'
insert into BOM select 2,1,'02'
insert into BOM select 3,0,'03'
insert into BOM select 4,2,'04'
go

--创建用户定义函数
create function f_getChild(@CID VARCHAR(10))
returns varchar(8000)
as
begin
declare @i int,@ret varchar(8000)
declare @t table(CID INT,PID INT,CODE VARCHAR(10),Level INT)
set @i = 1
insert into @t select CID,PID,CODE,@i from BOM where CID = @CID

while @@rowcount<>0
begin
set @i = @i + 1

insert into @t
select
a.CID,a.PID,a.CODE,@i
from
BOM a,@t b
where
a.CID=b.PID and b.Level = @i-1
end

select @ret = isnull(@ret,'')+'-'+CODE from @t order by level desc
set @ret = stuff(@ret,1,1,'')
return @ret
end
go


--执行查询
select CID,PID,CODE=dbo.f_getChild(CID) from BOM

--输出结果
/*
CID CODE
------ --------
1 01
2 01-02
3 03
4 01-02-04
*/

--删除测试数据
drop function f_getChild
drop table BOM
子陌红尘 2005-09-27
  • 打赏
  • 举报
回复
--生成测试数据
create table BOM(CID INT,PID INT,CODE VARCHAR(10))
insert into BOM select 1,0,'01'
insert into BOM select 2,1,'02'
insert into BOM select 3,0,'03'
insert into BOM select 4,2,'04'
go

--创建用户定义函数
create function f_getChild(@CID VARCHAR(10))
returns varchar(8000)
as
begin
declare @i int,@ret varchar(8000)
declare @t table(CID INT,PID INT,CODE VARCHAR(10),Level INT)
set @i = 1
insert into @t select CID,PID,CODE,@i from BOM where CID = @CID

while @@rowcount<>0
begin
set @i = @i + 1

insert into @t
select
a.CID,a.PID,a.CODE,@i
from
BOM a,@t b
where
a.CID=b.PID and b.Level = @i-1
end

select @ret = isnull(@ret,'')+'-'+CODE from @t order by level desc
set @ret = stuff(@ret,1,1,'')
return @ret
end
go

select CID,PID,CODE=dbo.f_getChild(CID) from BOM
go


drop function f_getChild
drop table BOM
wgsasd311 2005-09-27
  • 打赏
  • 举报
回复
create function f_1(@cid int)
returns varchar(8000)
as
begin
declare @s varchar(8000)
set @s=''
select @s=@s+code,@cid=pid from tb where cid=@cid
while @@rowcount>0
begin
select @s=@s+code,@cid=pid from tb where cid=@cid
end
return @s
end
go
select cid,[code]=dbo.f_1(cid) from tb
本插件特别之处:gbk 自动缓存、支持js调用、所有内容都是手工添加!不合适没有时间管理论坛,或是懒人使用!支持html代码! 特别注意“代码一定要严格规范”,否则你添加一定会出错!如果你出错,那就重新添加附件里的内容: 样例.txt图片带有编辑、删除、搜索、排序。 四大常见功能!值得一提的是:排序是可以用负数来排的哦!   例如 -1   -2   数值越小排越前,如果相等,则以最新传的那张在前js调用方法,请看最下面的常见问题那!提醒:不要随意删除html里的代码
  • 提醒你:如果你之前安装过其它插件,并改过一些程序,我建议你最好备份一下数据库,新论坛不必担心。非常安全! 绿色:到目前为止“附件下载500次以来,并没有收到因插件造成数据库坏掉的事!”为保证你使用正常,请你安装完后,立即做一件事:请按照“使用常见问题,第一步操作!”     如果你还是出现其它问题,最大原因是你改过DZ原程序(装过其它插件)卸载代码:后台执行SQL,方法:后台工具--数据库--升级DROP TABLE `cdb_idx_hotpic`;DROP TABLE `cdb_idx_woyo`;DROP TABLE `cdb_idx_data`; 5、使用常见问题----出现问题来这里看。。。:第一步 问:刚刚安装完插件后,首页的内空框是空白的,什么也没有?  问题严重哦!★★★★★★★★答:这是在升级的时候有些符号变成了乱码,没关系,为了你准备了文件!      解决方法:在附件里的:样式.txt          将这个文件里的三个内容复制到相关的内容框里:      前台 导航栏-----X格设置-----------论坛热点------城市热点+公告管理       重新提交即可!        多插句  注意:本html内容要严格按格式添加!像
  • 代码,别删了! 问:如何添加js! 老手也请看!答:后台---工具---数据调用---添加, 在数据模版中的内容框里,一定要在那里的代码前加上
  •   后加上
  •       否则你怎么也调用不了,会出错!     多插一句,其实7.0以经有边栏,别去调用了,调用也不合适。。。懒会懒出效率出来的! 问:如何改掉这些字:热点图片、城市热点、窝友原创答:那些文件都在plugins\indexx\templates 目录下,要改好多个文件,大家就一一搜相关文字来改吧,对你也有好处,加深了解嘛!      做人要厚道,不管你怎么改,请别将版权信息里的http://www.shenzhenluntan.com链接去除,否则一定追究! 问:如何改掉 深圳论坛定制版 这几个字!答:plugins\indexx\include\config.inc.php  改你自己喜欢的字即可! 问:插件在首页宽度太长,跟模版变形了!答:我的论坛所有模版带宽都是设定在980px的!所以插件设计的时候是按980px去设计!      解决方法:plugins\indexx\templates\show.css      改掉第一行里的:width: 954px;            954px随自己去调整,      提醒:有css菜鸟可能不会调,那你可以将自己的风格模版全部设为980px就解决了!      方法:后台----界面----风格管理-----找到相应模版编辑-----主体表格宽度设为  980px 即可解决 问:栏目看不到"X格设置"答:首先看下!  后台--界面---界面设置----导航栏  有没有开启插件这功能!如果开启了还解决不了:::后台---扩展 » 论坛插件 » 管理----首页热点X格---详细-----模块----X 格设置,是不是设成了"前台调用 前台菜单"其它修改方法,如果这里没有列出来,请大家自行研究。本人不一一解答!!1月3日11:19,修正小问题:A、修正:插件底色自动配背景色! B、修正:插件宽自动适应宽度!C、修正:升级后点击图片,不能弹出的问题!之前安装的用户按下面的方法就可以了,新下载的用户不须要!1、打开 templates/default/discuz.htm 找{eval @include_once(DISCUZ_ROOT.'./plugins/indexx/show.inc.php');} 替换成
    {eval @include_once(DISCUZ_ROOT.'./plugins/indexx/show.inc.php');}
    2、打开 plugins/inde

    34,590

    社区成员

    发帖
    与我相关
    我的任务
    社区描述
    MS-SQL Server相关内容讨论专区
    社区管理员
    • 基础类社区
    • 二月十六
    • 卖水果的net
    加入社区
    • 近7日
    • 近30日
    • 至今
    社区公告
    暂无公告

    试试用AI创作助手写篇文章吧