如何写这样一个sql语句啊

javabuilder9 2007-12-21 10:48:09
NodeID f_Id Name
2, 1, "泰安市交通局"
3, 2, "新泰市交通局"
4, 3, "新泰市运输公司"
5, 2, "肥城市交通局"
6, 5, "肥城市运输公司"

如果输入nodeid=2 那查询结果为 2,3,4,5,6 就是泰安市交通局的所有下属单位
如果输入nodeid=3 那查询为3,4 就是新泰市交通局的所有下属单位

我的思路是 根据nodeid=2 查询f_ID=2 的 然后加入临时表中, 在查询f_ID=2的nodeid 加入临时表中 但是具体的怎么写呢

如果还有更多的分级怎么办呢
...全文
132 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuxue1342 2007-12-21
  • 打赏
  • 举报
回复
不好意思.上面只能返回一条,下午回来如果你没搞好,我帮你改一下发给你!
chuxue1342 2007-12-21
  • 打赏
  • 举报
回复
我这里建了一个自定义函数返一个表,你放在你数据里面查询就可以了

CREATE FUNCTION get_treename (@treeid int)
RETURNS @temp table (treename varchar(200))
AS
BEGIN
declare @treename varchar(200)
declare @parentid varchar(50)
insert into @temp select treename from pertree where treeid=@treeid

set @parentid=(select top 1 treeid from pertree where parentid=@treeid)
while(@parentid is not null)
begin
insert into @temp select treename from pertree where treeid=@parentid
set @parentid=(select top 1 treeid from pertree where parentid=@parentid)
end
return
END
--调用
select * from get_treename(0)
xiaoku 2007-12-21
  • 打赏
  • 举报
回复
--retult
----------
2;3;4;
xiaoku 2007-12-21
  • 打赏
  • 举报
回复


create table t (nodeID int ,f_ID int ,name varchar(30))
insert into t values (2,1,'泰安市交通局')
insert into t values(3,2,'新泰市交通局')
insert into t values(4,3,'新泰市运输公司')

go

alter proc prGetTree(@Nid int)
as begin
declare @t table(fid int, id int)
insert into @t select f_id ,NodeID from t where nodeid= @nid

while @@rowcount>0
begin
print 1
insert into @t
select f_ID ,nodeID
from t
join @t a on f_ID = id
where not exists(select 1 from @t where a.id =FID)

end
--if you want to return a datatable
--select * from @t
declare @str varchar(1000)
select @str = ''
select @str = @str + cast(id as varchar(10)) + ';' from @t
select @str
return

end
go
prGetTree 2
dreamdragon2007 2007-12-21
  • 打赏
  • 举报
回复
补充说明一下。

while @@rowcount> 0
begin
--select * from #temp 注意这一条,把该条删除掉,这是偶调试时,为了看临时表如何插入数据用的无意义语句 set @level = @level + 1
insert into #temp ([NodeID],[f_ID],[Name],[level])
select a.[NodeID],a.[f_ID],a.[Name],@level from temp1 a, #temp b
where a.[f_ID]=b.[NodeID] and b.[level] = @level -1
end
dreamdragon2007 2007-12-21
  • 打赏
  • 举报
回复
满足楼主要求的存储过程,已经在SQLServer2000上调试通过,拷贝可用


CREATE PROCEDURE GetTreeNode
(
@id int
)
AS
Create Table #temp
(
NodeID int,
f_ID int,
[Name] varchar(50),
[level] int
)

declare @level int
set @level = 0
insert into #temp ([NodeID],[f_ID],[Name],[level])
select [NodeID],[f_ID],[Name],@level from temp1 where [f_ID]=@id
while @@rowcount>0
begin
select * from #temp
set @level = @level + 1
insert into #temp ([NodeID],[f_ID],[Name],[level])
select a.[NodeID],a.[f_ID],a.[Name],@level from temp1 a, #temp b
where a.[f_ID]=b.[NodeID] and b.[level] = @level -1
end

select [NodeID],[f_ID],[Name] from #temp
return 0
GO
sadanzhizi 2007-12-21
  • 打赏
  • 举报
回复
这是添加到DropDownList1中的,这个问题用递归来写就行了,下面是我以前写的代码,你可以看着改。
//递归显示设备类型:
DataTable dt = null;
private void Temp()
{
this.DropDownList1.Items.Add("无");

//得到所有的名称:
DataSet ds = SqlHelper.ExecuteDataset(SysFrame.ConnectonString ,CommandType.Text,
"select NodeID,f_Id ,Name from Table");

dt = ds.Tables[0];

//第一层加载(ID为2)
DataRow[] drs = dt.Select("f_Id=2");
for (int i = 0; i < drs.Length; i++)
{
string name = drs[i][2].ToString();
int id = Convert.ToInt32(drs[i][0]);

this.DropDownList1.Items.Add(name);
this.DropDownList1.Items[this.DropDownList1.Items.Count - 1].Value = id.ToString();
j = 0;
LoadTree(id);
}
}

int j = 0;
//递归函数:
private void LoadTree(int typeid)
{
string test = "";
DataRow[] drs = dt.Select("f_Id=" + typeid + "");

if (drs != null)
{
j++;
for (int i = 0; i < j; i++)
{
test = test + "|-";
}

for (int i = 0; i < drs.Length; i++)
{
this.DropDownList1.Items.Add(test + drs[i][2].ToString());
this.DropDownList1.Items[this.DropDownList1.Items.Count - 1].Value = drs[i][0].ToString();

LoadTree(Convert.ToInt32(drs[i][0]));
}
}
}
JGood 2007-12-21
  • 打赏
  • 举报
回复
不难,不过看了楼主的例子,我有点晕。
vrhero 2007-12-21
  • 打赏
  • 举报
回复
用不着临时表...PL-SQL有专门的函数处理...T-SQL自己写个函数...用存储过程返回结果...

搜一下大把代码...要不就等有空的给你写吧...
cloudfang 2007-12-21
  • 打赏
  • 举报
回复

select NodeID,f_Id,Name from table1 where NodeID=3 or f_Id=3 or f_Id in(select NodeID from table1 where f_Id=3)
cloudfang 2007-12-21
  • 打赏
  • 举报
回复

select NodeID,f_Id,Name from table1 where NodeID=3 or f_Id=3 or f_Id in(select NodeID from table1 where f_Id=3)
大正他爹 2007-12-21
  • 打赏
  • 举报
回复
无限分类比较好办
写一个递归就可以做到。
mainbaby 2007-12-21
  • 打赏
  • 举报
回复
我倒是看明白了,不过想不出来。
dh2087 2007-12-21
  • 打赏
  • 举报
回复
写一个递归函数,返回所有下属ID,
xiaoku 2007-12-21
  • 打赏
  • 举报
回复
oh
不难!写个存储过程就ok...
典型的子父
hanbb1982 2007-12-21
  • 打赏
  • 举报
回复
没能看懂你的意思。
javabuilder9 2007-12-21
  • 打赏
  • 举报
回复
急哦 望大家帮帮我
javabuilder9 2007-12-21
  • 打赏
  • 举报
回复
谢谢 大家

62,046

社区成员

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

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

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

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