给定一下三个表
表a-职务表 字段 id parentid 职务编号 职务全称
表b-用户表 字段 id 用户编号 用户全称
表c-用户职务表 字段 用户编号 职务编号
要求写一条sql语句生成一个结果集,次结果集要求如下
(1)有如下几列 id parentid 编号 全称
(2) 及国际记录了所有的项(职务和用户)及他们的父子关系,其中每一列是一个职务或者一个用户的信息
(3)若一项为叶子节点,则id可以为空,否则为原在表的id求解惑,求老师
表a-职务表 字段 id parentid 职务编号 职务全称
表b-用户表 字段 id 用户编号 用户全称
表c-用户职务表 字段 用户编号 职务编号
要求写一条sql语句生成一个结果集,次结果集要求如下
(1)有如下几列 id parentid 编号 全称
(2) 及国际记录了所有的项(职务和用户)及他们的父子关系,其中每一列是一个职务或者一个用户的信息
(3)若一项为叶子节点,则id可以为空,否则为原在表的id求解惑,求老师
解决方案 »
- 我的sqlserver2000怎么用windows身份验证连接不上啊?
- 请教一个关联SQL如何写?在线等待!
- 请教一个SQL统计语句
- sql语句in 后面跟的数据过多怎么解决??????
- sql sever的存储过程转成sybase下的,有什么好的工具吗?
- 老大些,我给分,救命啊!!!!!!!!!!!!!!!!!
- 一个创建表的问题?老大们请指点
- 如何将2006-02-27 13:36:36.000 ,通过SQL函数变为2006-02-27
- 为何进行数据更新提示‘UPDATE FAILED’?
- 关于提高数据统计的效率(寻解决思路)
- 问个SQL的问题,请围观!
- 请问一下如果要建立的表中含有特殊符号怎么办?
求的结果是什么的名字和全称
你可以先把表结构弄出来的嘛
比如L:
tb_duty(id int,parentid int, dt_id int,dt_name varchar(64))
tb_users(id int,user_id int,user_name varchar(64))
duty_users(user_id int,dt_id int)
这个题目问的不清楚
求的结果是什么的名字和全称
你可以先把表结构弄出来的嘛
比如L:
tb_duty(id int,parentid int, dt_id int,dt_name varchar(64))
tb_users(id int,user_id int,user_name varchar(64))
duty_users(user_id int,dt_id int)
[/Q
表结构很清楚啊,有如下几列 id parentid 编号 全称,就这4列啊
ID Code name,就是可以。
Code的值用下面的逻辑编辑。
001 局长
001.001 处长3 另外还一个更宽泛的树形结构,如分别按照:
职务
年龄
人员
来查询。
要列出表结构,原始数据,还有期望的结果集,
这样才会有人给你sql语句。
sorry,不明白你说的是啥
我告诉你网站的提问的正确方法,
这样你不用问了两天还没人理你。还有你提问过于简单,要列出表结构,原始数据,还有期望的结果集,这样才会有人给你sql语句。
楼主你有点浮躁啊,有点不虚心啊,那你出这个题给大家,是想简单得到答案,好去应付一下面试官。还是想通过向大家请教,学习到这种递归算法的sql写法。
(id int,parentid int,职务编号 int,职务全称 nvarchar(50))
insert #职务表
select 1,null,11,'董事长' union all
select 2,1,12,'经理' union all
select 3,2,13,'主管' union all
select 4,3,14,'员工'create table #用户表
(id int,用户编号 int,用户全称 nvarchar(50))
insert #用户表
select 1,21,'大爷' union all
select 2,22,'大哥A' union all
select 3,23,'大哥B' union all
select 4,24,'小哥A' union all
select 5,25,'小哥B' union all
select 6,26,'小哥C' union all
select 7,27,'小弟A' union all
select 8,28,'小弟B' union all
select 9,29,'小弟C' union all
select 10,30,'小弟D' create table #用户职务表
(用户编号 int,职务编号 int)
insert #用户职务表
select 21,11 union all
select 22,12 union all
select 23,12 union all
select 24,13 union all
select 25,13 union all
select 26,13 union all
select 27,14 union all
select 28,14 union all
select 29,14 union all
select 30,14 select (case when z3.id is null then '' else ltrim(u.id) end) id,
uz.用户编号,u.用户全称,uz.职务编号,z.职务全称,
z2.职务编号 as 领导职称编号 ,z2.职务全称 as 领导职称
from #用户表 as u
join #用户职务表 as uz on u.用户编号=uz.用户编号
join #职务表 as z on uz.职务编号=z.职务编号
Left join #职务表 z2 on z.parentid=z2.id
Left join #职务表 z3 on z.id=z3.parentid--id 用户编号 用户全称 职务编号 职务全称 领导职称编号 领导职称
-------------- ----------- ---------------- ----------- ---------------- ---------------- ---------
--1 21 大爷 11 董事长 NULL NULL
--2 22 大哥A 12 经理 11 董事长
--3 23 大哥B 12 经理 11 董事长
--4 24 小哥A 13 主管 12 经理
--5 25 小哥B 13 主管 12 经理
--6 26 小哥C 13 主管 12 经理
-- 27 小弟A 14 员工 13 主管
-- 28 小弟B 14 员工 13 主管
-- 29 小弟C 14 员工 13 主管
-- 30 小弟D 14 员工 13 主管
你好聪明,思路很清晰,我头都搞晕了,有2个问题
1.case when z3.id 是不是应该是z3.parentid
2.Left join #职务表 z2 on z.parentid=z2.id
Left join #职务表 z3 on z.id=z3.parentid 看不懂搞晕了,能不能解释下
uz.用户编号,u.用户全称,uz.职务编号,z.职务全称,
z2.职务编号 as 领导职称编号 ,z2.职务全称 as 领导职称
from #用户表 as u
join #用户职务表 as uz on u.用户编号=uz.用户编号
join #职务表 as z on uz.职务编号=z.职务编号
Left join #职务表 z2 on z.parentid=z2.id
Left join #职务表 z3 on z.id=z3.parentid--"Left join #职务表 z2 on z.parentid=z2.id" 这句
--是为了 " z2.职务编号 as 领导职称编号 ,z2.职务全称 as 领导职称 "这两列而写的..
--注意" z.parentid=z2.id ",z跟z2的内容都是#职务表的内容(但你要把它们想像成两个表,只是内容相同),这种叫自连接,
--" z.parentid=z2.id " 连接条件是z的parentid等于z2的id..z中的parentid是自己的领导的职称编号吧..
--以这条数据为例( id=2 , parentid=1 , 职务编号=12 ,职务全称='经理' )
-- 因为parentid=1,跟据 z.parentid=z2.id 到z2中找对应的 id,就找到'董事长'了..
--看看这句的结果..select z.*,z2.职务编号 as 领导职称编号 ,z2.职务全称 as 领导职称
from #职务表 as z
Left join #职务表 z2 on z.parentid=z2.id--id parentid 职务编号 职务全称 领导职称编号 领导职称
------------- ----------- ----------- ---------------- ----------------- -----------
--1 NULL 11 董事长 NULL NULL
--2 1 12 经理 11 董事长
--3 2 13 主管 12 经理
--4 3 14 员工 13 主管
--" Left join #职务表 z3 on z.id=z3.parentid "这句
-- 是为了 " (case when z3.id is null then '' else ltrim(u.id) end) id "这列而写的..
-- 注意" z.id=z3.parentid ",也是自连接,
-- 连接条件是z的id等于z3的parentid..z从z3中找自己的下属..
-- 以这条数据为例( id=4 , parentid=3 , 职务编号=14 ,职务全称='员工' )
-- 因为id=4,跟据 z.id=z3.parentid 到z3中找对应的 parentid,z3中没有一条数据的parentid为4的,所以什么也找不到
-- 看看这句的结果..select (case when z3.id is null then '' else ltrim(z.id) end) zid,
z.*,z3.*
from #职务表 as z
Left join #职务表 as z3 on z.id=z3.parentidzid id parentid 职务编号 职务全称 -- id parentid 职务编号 职务全称
------- --- ----------- ----------- -------------------------------------------------- -----------
1 1 NULL 11 董事长 -- 2 1 12 经理
2 2 1 12 经理 -- 3 2 13 主管
3 3 2 13 主管 -- 4 3 14 员工
4 3 14 员工 -- NULL NULL NULL NULL--注意看结果右边部分('--'的右边),第4行是null的..
--所以在判断zid这一列是取id还是null的时候, 用"z3.id is null" 或 "z3.parentid is null" 是一样的..