编号 推荐编号 职级
001 01
002 01
003 001 02
004 003 02
005 004 03
006 005 03
007 006 04
008 007 04
009 008 05
010 002 02
011 010 02
012 011 02 得到如下结果
编号 职级关系
009 001,004,005,008,009,
012 002,012
001 001,
002 002,
003 001,003,
……
表中如果编号与推荐编号同职级则按推荐编号的上一级编号查找
如012 的推荐编号为011但职级都为02则,以次,012的职级关系为002,012
弄了好几天还是查不到正确的结果 ,请大家帮忙看看~~~
解决方案 »
- SQL中字符串数字比较
- 包含某表字段内容的过滤
- LEFT OUTER JOIN 左表记录变多是什么原因?
- File和Filegroup的问题
- 奇怪的sql存储过程问题
- 如果语句中包含 UNION 运算符,那么 ORDER BY 子句中的项就必须出现在选择列表中?
- 使用排它锁,如何给他解锁呢?SELECT * FROM BM_WZXXBM_TMP WITH (TABLOCKX)
- 请问:日志文件疯狂增长是怎么回事?
- 在线紧急求救
- VFP中,工具栏中的事件程序访问所属的formset中的OLEBoundcontrol失败!
- 关于数据库Select查询的问题
- 求SQL语句,在线等,请进。。。。。。。。。重复记录的问题
returns varchar(8000)
as
begin
declare @re varchar(8000),@pid varchar(8000) --为了数字排序正常,需要统一编码宽度
declare @idlen int,@idheader varchar(20)
select @idlen=max(len(编号))
,@idheader=space(@idlen)
from vperson2 --得到编码累计
set @re=right(@idheader+@id,@idlen)
select @pid=推荐人编号 from vperson2 where 编号=@id
while @@rowcount>0
set @re=@re+@@rowcount
select @re=right(@idheader+@pid,@idlen)+@re
,@pid=推荐人编号 from vperson2 where 编号=@pid
return(@re)
end
我用的是这个函数,但是职级的限制条件我不知道应该加在哪?
/*
用递归处理树型结构(表结构)
递归求城市,从小到大的,或从大到小。
*/
/*
等依次类推得目录树结构
我想写一个函数 传入部门ID号后 马上得到相应的 部门结构 如
输入8得到的是市场部-东南市场-上海市
输入9得到的是市场部-西北市场-北京市
输入6得到的是市场部-西北市场输入3得到的是市场部输入1得到的是所有部门
*/
--建立测试环境
create table TableA(deptID int,deptName nvarchar(100),parentID int)
insert into TableA
select 1,'所有部门',0 union all
select 2,'财务部', 1 union all
select 3,'市场部', 1 union all
select 4,'仓库管理',1 union all
select 5,'东北市场',3 union all
select 6,'西北市场',3 union all
select 7,'东南市场',3 union all
select 8,'上海市', 7 union all
select 9,'北京市', 6--建立函数
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AllDept]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[AllDept]
GOCREATE function AllDept(@iDeptID int)
returns nvarchar(1000)
as
begin
declare @vReturnValue nvarchar(1000)
,@iParentID int
,@vCurrentDeptName nvarchar(200)
select @vReturnValue=''
,@vCurrentDeptName=''
if(exists(select top 1 0 from TableA where DeptID=@iDeptID and parentID=0))
begin
select @vReturnValue =@vReturnValue+deptName+'-'
from TableA
where parentID<>0
return (@vReturnValue)
end
if(exists(select top 1 0 from TableA where DeptID=@iDeptID and parentID=1))
begin
select @vReturnValue=@vReturnValue+deptName
from TableA where DeptID=@iDeptID and parentID=1
--return (@vReturnValue)
--set @vReturnValue=@vReturnValue+dbo.AllDept(@iParentID)
end
else
begin
select @iParentID=parentID
,@vCurrentDeptName=deptName
from TableA
where DeptID=@iDeptID
set @vReturnValue=@vReturnValue+@vCurrentDeptName+'-'+dbo.AllDept(@iParentID)
--return (@vReturnValue)
end
return (@vReturnValue)
endGO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GOselect *,dbo.AllDept(deptid) AllDeptName from tableAselect * from tableA
--显示结果
deptId deptName AllDeptName
1 所有部门 0 财务部-市场部-仓库管理-东北市场-西北市场-东南市场-上海市-北京市-
2 财务部 1 财务部
3 市场部 1 市场部
4 仓库管理 1 仓库管理
5 东北市场 3 东北市场-市场部
6 西北市场 3 西北市场-市场部
7 东南市场 3 东南市场-市场部
8 上海市 7 上海市-东南市场-市场部
9 北京市 6 北京市-西北市场-市场部
--删除测试环境
drop table tableA
drop table dbo.AllDept
(
编号 varchar(5),
推荐编号 varchar(5),
职级 varchar(5)
)insert A select '001',' ','01'
insert A select '002',' ','01'
insert A select '003','001','02'
insert A select '004','003','02'
insert A select '005','004','03'
insert A select '006','005','03'
insert A select '007','006','04'
insert A select '008','007','04'
insert A select '009','008','05'
insert A select '010','002','02'
insert A select '011','010','02'
insert A select '012','011','02'create Function leva(@id varchar(10))
returns varchar(1000)
as
begin
declare @T_SQL varchar(1000)
set @T_SQL=''
declare @T table(编号 varchar(5),推荐编号 varchar(5),职级 varchar(5),leva int)
declare @leva int
set @leva=1
insert @T select 编号,推荐编号,职级,@leva from A where 编号=@id
while @@rowcount>0
begin
set @leva=@leva+1
insert @T select T1.编号,T1.推荐编号,T1.职级,@leva from A T1,(select * from @T where leva=@leva-1) T2 where T1.编号=T2.推荐编号
end
select @T_SQL=@T_SQL + T.推荐编号 +',' from (select min(推荐编号) as 推荐编号,职级 from @T where 推荐编号<>'' group by 职级)T
set @T_SQL= @T_SQL+ @id
return @T_SQL
endselect 编号,Dbo.leva(编号) from A