结构如下:
人员(id,userId)
用户(userId,depId)
部门(depId)
辖区(popId)
部门辖区(depid,popId)我需要根据 某个用户 获取用户所在部门所管理的辖区的所有人员信息...
实在想不出 怎么去 写这个 sql 求 前辈指点....
人员(id,userId)
用户(userId,depId)
部门(depId)
辖区(popId)
部门辖区(depid,popId)我需要根据 某个用户 获取用户所在部门所管理的辖区的所有人员信息...
实在想不出 怎么去 写这个 sql 求 前辈指点....
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
from 人员 a inner join 用户 b on a.userId=b.userId
inner join .....
到底幾個表啊?
没有数据?感觉类似树
IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb
GO
CREATE TABLE tb(id VARCHAR(3),pid VARCHAR(3),[name] VARCHAR(10))
GO
INSERT INTO tb SELECT '001',NULL,'河南省'
UNION ALL SELECT '002','001','洛阳市'
UNION ALL SELECT '003','001','新乡市'
UNION ALL SELECT '004','002','栾川县'
UNION ALL SELECT '005','003','长垣县'
UNION ALL SELECT '006','002','孟津县'
UNION ALL SELECT '007','004','冷水乡'
UNION ALL SELECT '008','004','叫河乡'
UNION ALL SELECT '009','008','A村'
UNION ALL SELECT '010','008','B村'
GO
/*
1、查询指定节点及其所有子节点
--如:已知 栾川县
--得到结果id pid name
---- ---- ----------
004 002 栾川县
007 004 冷水乡
008 004 叫河乡
009 008 A村
010 008 B村
*/****************************查询开始******************************
--SQL2005 使用CTE
DECLARE @ VARCHAR(10)
SET @='栾川县'
;WITH XiaoAi AS
(
SELECT id FROM tb WHERE [name]=@
UNION ALL
SELECT t.id FROM XiaoAi AS a INNER JOIN tb AS t ON a.id=t.pid
)
SELECT t.* FROM XiaoAi
--SQL 2000 使用函数
IF OBJECT_ID('dbo.XiaoAi') IS NOT NULL DROP FUNCTION dbo.XiaoAi
GO
CREATE FUNCTION dbo.XiaoAi(@ VARCHAR(20))
RETURNS @t TABLE(id VARCHAR(3), pid VARCHAR(3), [name] VARCHAR(20),Level INT)
AS
BEGIN
DECLARE @level INT
SET @level=1
INSERT INTO @t SELECT *,@level FROM tb WHERE [name]=@
WHILE(@@ROWCOUNT>0)
BEGIN
SET @level=@level+1
INSERT INTO @t SELECT t.*,@level FROM tb AS t,@t AS a WHERE a.id=t.pid AND a.level=@level-1
END
RETURN
END
GO
--调用函数
SELECT id, pid,[name] from dbo.XiaoAi('栾川县')
--****************************查询结束*************************************
人员表(id,userId)--人员ID,用户ID
用户表(userId,depId) --用户ID,用户所属部门ID
部门表(depId)--部门ID
辖区表(popId)--辖区ID
部门辖区中间表(depid,popId)--部门ID,辖区ID
create table employee(
empId varchar(20),
userId varchar(20)
)
create table user(
userId varchar(20),
depId varchar(20)
)
create table dep(
depId varchar(20),
depName var(20)
)
create table pop(
popId varchar(20),
popName varchar(20)
)create table T_dep_pop(
depId varchar(20),
popId varchar(20)
)
insert into dep values('1','办公室');insert into pop values('1','青秀区');
insert into pop values('2','罗湖区');
insert into pop values('3','秀峰区');insert into T_dep_pop values('1','1);
insert into T_dep_pop values('1','2');insert into user values('1','1');insert into employee values('1','1');我想查询 用户ID = 1, 所在 的部门id = 1,下面所包含的辖区 = 1,2, 所 包含的 人员信息 emp
select * from 部门辖区中间表
where 辖区ID=(select 辖区ID from 部门辖区中间表
where 部门ID=(select 用户所属部门ID from 用户表
where 用户ID=@用户ID)) c
where a.用户ID=b.用户ID and b.部门ID=c.部门ID
没有和pop 产生关联呀
这个好像快查出来了但是..... 辖区ID= 这个地方如果用 "=" 就会 查不出 并且报错
用 in 的话 出来的记录会很多 并且重复
因为 辖区和部门 多对多的关系...
[user] u on e.userId=u.userId
where depId in
(
select distinct depId from T_dep_pop
where popId in
(
select popId from T_dep_pop where depId= (select depId from[user] where userId=1))
)
IF object_id('A') IS NOT NULL DROP TABLE A
IF object_id('U') IS NOT NULL DROP TABLE U
IF object_id('D') IS NOT NULL DROP TABLE D
IF object_id('P') IS NOT NULL DROP TABLE P
IF object_id('DP') IS NOT NULL DROP TABLE DP
go
CREATE TABLE A --人员表
(
ID VARCHAR(10) ,
USERID VARCHAR(10)
)
CREATE TABLE U --用户表
(
USERID VARCHAR(10),
DEPID VARCHAR(10)
)
CREATE TABLE D --部门表
(
DEPID VARCHAR(10),
DEPNAME VARCHAR(20)
)
CREATE TABLE P --辖区表
(
POPID VARCHAR(10),
POPNAME VARCHAR(20)
)
CREATE TABLE DP --部门辖区中间表
(
DEPID VARCHAR(10),
POPID VARCHAR(10)
)
go
insert D
select 'D1','部门1' union all
select 'D2','部门2' union all
select 'D3','部门3' union all
select 'D4','部门4'
go
insert P
select 'P1','辖区1' union all
select 'P2','辖区2' union all
select 'P3','辖区3' union all
select 'P4','辖区4'
go
insert DP
select 'D1','P1' union all
select 'D1','P2' union all
select 'D1','P3' union all
select 'D1','P4' union all
select 'D2','P1' union all
select 'D2','P2' union all
select 'D2','P4'
go
insert U
select 'U1','D1' union all
select 'U2','D1' union all
select 'U3','D1' union all
select 'U4','D2' union all
select 'U5','D2' union all
select 'U6','D2' union all
select 'U7','D3' union all
select 'U8','D3' union all
select 'U9','D3' union all
select 'U10','D4' union all
select 'U11','D4' union all
select 'U12','D4'
go
insert A
select 'A1','U1' union all
select 'A2','U2' union all
select 'A3','U3' union all
select 'A4','U4' union all
select 'A5','U5' union all
select 'A6','U6' union all
select 'A7','U7' union all
select 'A8','U8' union all
select 'A9','U9' union all
select 'A10','U10' union all
select 'A11','U11' union all
select 'A12','U12'
go--我需要根据 某个用户 获取用户所在部门所管理的辖区的所有人员信息...
--查询
select A.ID,U.USERID,U.DEPID FROM
A
INNER JOIN U ON A.USERID=U.USERID
INNER JOIN
(
select DEPID from DP where POPID in
(select POPID from DP where DEPID=
(
select DEPID from U where USERID=
(select USERID from A where ID='A1')
)
) group by DEPID
) T on t.DEPID=u.DEPID--结果
ID UserID DepID
A1 U1 D1
A2 U2 D1
A3 U3 D1
A4 U4 D2
A5 U5 D2
A6 U6 D2(6 行受影响)
soRRY 应该是IN,手抖了一下。