求一sql语句------

yixiaojn 2009-02-10 09:38:28
我这个项目中有一部分是收费项目树状列表,由于数据较多,故采用父级递归动态生成的。
如:
id name father
001 教育收费 0 该条数据为列表的一级节点
002 课本 001 该条数据为001的一个子节点
003 大学课本 002 该条数据为002的一个子节点
004 ×××× 0

但是我做模糊查询时现在查出一条数据如
003 大学课本 002 该条数据为002的一个子节点
我要显示这条数据的父级,这样给人感觉比较明了,如:
001 教育收费 0 该条数据为列表的一级节点
002 课本 001 该条数据为001的一个子节点
003 大学课本 002 该条数据为002的一个子节点

请问各位能否用SQL语句直接获得这样的数据集???????不胜感激!!!!!!!
...全文
124 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yixiaojn 2009-02-11
  • 打赏
  • 举报
回复
谢谢各位了
ws_hgo 2009-02-11
  • 打赏
  • 举报
回复
sql版不是跟你写了码?
ws_hgo 2009-02-11
  • 打赏
  • 举报
回复
if object_id('tb') is not null drop table tb
create table tb
(
id char(6),
[name] varchar(20),
father char(6)
)
insert into tb select '001','教育收费','0'
union all select '002','课本','001'
union all select '003','大学课本','002'

;with hgo as
(
select * from tb where [name]=N'大学课本'
),
hgo1 as
(
select b.* from tb b,hgo h where b.id=h.father
),
hgo2 as
(
select b.* from tb b,hgo1 h where b.id=h.father
)
select * from hgo2
union all
select * from hgo1
union all
select * from hgo
id name father
------ -------------------- ------
001 教育收费 0
002 课本 001
003 大学课本 002

(3 行受影响)
ws_hgo 2009-02-11
  • 打赏
  • 举报
回复
IF NOT OBJECT_ID('TB') IS NULL DROP TABLE TB
GO
CREATE TABLE TB([ID] NVARCHAR(3),[NAME] NVARCHAR(4),[FATHER] NVARCHAR(3))
Insert tb
SELECT N'001',N'教育收费',N'0' UNION ALL
SELECT N'002',N'课本',N'001' UNION ALL
SELECT N'003',N'大学课本',N'002' UNION ALL
SELECT N'004',N'劳而无功',N'0'
Go
SELECT * FROM TB

CREATE PROCEDURE P_TB_SEARCH
(@NAME VARCHAR(10))
AS
DECLARE @IDNO VARCHAR(10)
SELECT * INTO # FROM TB WHERE NAME=@NAME
SELECT @IDNO=FATHER FROM TB WHERE NAME=@NAME
WHILE @@ROWCOUNT>0
BEGIN
INSERT INTO # SELECT * FROM TB WHERE TB.ID=@IDNO
SELECT @IDNO=FATHER FROM TB WHERE ID=@IDNO
END
SELECT * FROM # ORDER BY ID
/*
ID NAME FATHER
---- ---- ------
001 教育收费 0
002 课本 001
003 大学课本 002

(所影响的行数为 3 行)

*/
ws_hgo 2009-02-11
  • 打赏
  • 举报
回复
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([id] varchar(3),[name] varchar(8),[father] varchar(3))
insert [tb]
select '001','教育收费','0' union all
select '002','课本','001' union all
select '003','大学课本','002' union all
select '004','××××','0'
go

with szx as
(
select * from tb where name='大学课本'
union all
select a.* from tb a join szx b on a.id=b.father
)
select * from szx order by id
--测试结果:
/*
id name father
---- -------- ------
001 教育收费 0
002 课本 001
003 大学课本 002

(3 行受影响)
*/
路人乙e 2009-02-11
  • 打赏
  • 举报
回复
create table [aa] ( [_id] [varchar] (10) NOT NULL , [_name] [varchar] (50) NOT NULL , [_fid] [varchar] (10) NOT NULL )

insert [aa] ( [_id] , [_name] , [_fid] ) values ( '001' , '教育' , '0' )
insert [aa] ( [_id] , [_name] , [_fid] ) values ( '002' , '大学' , '001' )
insert [aa] ( [_id] , [_name] , [_fid] ) values ( '003' , '课本' , '002' )

create procedure getTree
@name varchar(50)
as
create table #ids
(_id varchar(10))
declare @id varchar(10)
select top 1 @id=_id from aa where _name=@name
while @id is not null and @id<>'0'
begin
insert into #ids values(@id)
select top 1 @id=_fid from aa where _id=@id
end
select aa.* from aa,#ids where aa._id=#ids._id
drop table #ids

exec getTree '课本'
Jack_xiao 2009-02-11
  • 打赏
  • 举报
回复
示例中只有三层(教育收费-〉课本-〉大学课本)。
如果层次比较深的话(如fid->f1id->f2id->f3id...),恐怕要写函数才成
jfd198512 2009-02-11
  • 打赏
  • 举报
回复
like 查询! 顶下
xfreyes 2009-02-11
  • 打赏
  • 举报
回复
模糊查询自己会做吧
xfreyes 2009-02-11
  • 打赏
  • 举报
回复

select * from yourtable t1 where t1.name = '大学课本'
union select * from yourtable t2 where t2.id in (select father from yourtable where name = '大学课本')
union select * from yourtable t3 where t3.ID in(select father from yourtable t2 where t2.id in (select father from yourtable where name = '大学课本'))



yixiaojn 2009-02-11
  • 打赏
  • 举报
回复
谢谢各位的捧场,怪我没说明白,我有如下数据表table
id name father
001 教育收费 0 该条数据为列表的一级节点
002 课本 001 该条数据为001的一个子节点
003 大学课本 002 该条数据为002的一个子节点
004 ×××× 0
但是我做模糊查询时现在查出一条数据如
select * from table where name='大学课本'
得到如下结果:
id name father
003 大学课本 002
但是客户要求也显示出这条数据的父级(因为大学课本属于课本,而课本又属于教育收费),即得到如下结果:

001 教育收费 0 该条数据为列表的一级节点
002 课本 001 该条数据为001的一个子节点
003 大学课本 002 该条数据为002的一个子节点

请问能否用SQL语句直接获得这样的数据集???????不胜感激!!!!!!!
net_boy 2009-02-11
  • 打赏
  • 举报
回复
id name father TopID Level
001 教育收费 0 -1 1 该条数据为列表的一级节点
002 课本 001 001 2 该条数据为001的一个子节点
003 大学课本 002 001 3 该条数据为002的一个子节点


我公司电脑没有sql server 只能给你提供思路了,这样就能写出通用的sql语句来实现了。

net_boy 2009-02-11
  • 打赏
  • 举报
回复
还可以加上Level字段,记录树的级别,这样用上面别人写的sql语句就可以实现了,因为有了Level就知道sql语句要进行多少级联了。
net_boy 2009-02-11
  • 打赏
  • 举报
回复
可能有的地方没有讲明白,不过基本是这样的了,你可以把递归等代码都放到存储过程里实现,然后直接返回结果数据集就行
net_boy 2009-02-11
  • 打赏
  • 举报
回复
首先数据表结构做一下调整,最好增加一个字段,记录顶级节点的ID,比如叫TopID,当节点为顶级节点是为-1;

当查询003 大学课本 002 时,得到数据如下

003 大学课本 002 001

这时,你就可以从顶级开始,递归实现查询结果了,当递归到003时,退出,然后用树显示出来
cs78799662 2009-02-10
  • 打赏
  • 举报
回复
没有看明白!
OnlyU_Myheart 2009-02-10
  • 打赏
  • 举报
回复
有点晕,建议去SQL中问问
yagebu1983 2009-02-10
  • 打赏
  • 举报
回复
相当于递归功能。。。
yagebu1983 2009-02-10
  • 打赏
  • 举报
回复
你可以写个SQL函数。。。
Terry717 2009-02-10
  • 打赏
  • 举报
回复
能不能说得具体点,看不出想问的问题是什么?
加载更多回复(3)

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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