有三张表,用户表(Users),部门表(Dep)和客户表(Cust)。
客户表有UserID关联Users表中的ID主键,表示这个客户属于这个用户的。
用户表有DepID关联Dep表中的ID主键,表示这个用户是这个部门的。
部门表有UpID关联同一个表中的主键,表示这个部门的上级部门。
现在想查出这个用户所在部门的人员的所有客户,求SQL语句。在线等待,万分感谢!
不光是这个用户当前部门的客户,包括他们的下级部门也要查询出来。
求一句SQL语句。
答案:5 悬赏:0 手机版
解决时间 2021-01-03 09:59
- 提问者网友:刺鸟
- 2021-01-02 20:14
最佳答案
- 五星知识达人网友:夜余生
- 2021-01-02 20:23
-- 用户表
-- 用户表有DepID关联Dep表中的ID主键,表示这个用户是这个部门的。
CREATE TABLE t_Users (
UserID INT PRIMARY KEY,
DepID INT,
UserNAME VARCHAr(10)
)
GO
-- 部门表
-- 部门表有UpID关联同一个表中的主键,表示这个部门的上级部门。
CREATE TABLE t_Dep (
DepID INT PRIMARY KEY,
UpID INT,
DepNAME VARCHAr(10)
)
GO
-- 客户表
-- 客户表有UserID关联Users表中的ID主键,表示这个客户属于这个用户的。
CREATE TABLE t_Cust (
CustID INT PRIMARY KEY,
UserID INT,
CustName VARCHAr(10)
)
GO
INSERT INTO t_Dep
SELECt 1, NULL, '顶级部门' UNIOn ALL
SELECT 2, 1, '2级部门1' UNIOn ALL
SELECT 3, 1, '2级部门2' UNIOn ALL
SELECT 4, 2, '3级部门1' UNIOn ALL
SELECT 5, 2, '3级部门2'
GO
INSERT INTO t_Users
SELECT 1, 1, '顶级员工' UNIOn ALL
SELECT 2, 2, '2级员工1' UNIOn ALL
SELECT 3, 2, '2级员工2' UNIOn ALL
SELECT 4, 3, '2级员工3' UNIOn ALL
SELECT 5, 3, '2级员工4' UNIOn ALL
SELECT 6, 4, '3级员工1' UNIOn ALL
SELECT 7, 4, '3级员工2'
GO
INSERT INTO t_Cust
SELECT 1, 1, '顶级客户' UNIOn ALL
SELECT 2, 2, '2级客户1' UNIOn ALL
SELECT 3, 3, '2级客户2' UNIOn ALL
SELECT 4, 4, '2级客户3' UNIOn ALL
SELECT 5, 5, '2级客户4' UNIOn ALL
SELECT 6, 6, '3级客户1' UNIOn ALL
SELECT 7, 7, '3级客户2'
GO
WITH
dep_cus_cte
AS(
SELECT
t_Dep.DepID,
t_Dep.UpID,
t_Cust.CustName
FROM
t_Dep
JOIN t_Users
ON (t_Dep.DepID = t_Users.DepID)
JOIN t_Cust
ON (t_Users.UserID = t_Cust.UserID)
) ,
tree_cte
AS (
SELECt
DepID,
CustName
FROM
dep_cus_cte
WHERe
DepID IN (SELECt DepID FROM t_Users t WHERe t.UserNAME = '顶级员工' )
UNIOn ALL
SELECt
dep_cus_cte.DepID,
dep_cus_cte.CustName
FROM
tree_cte
JOIN dep_cus_cte
ON (tree_cte.DepID = dep_cus_cte.UpID)
)
SELECt CustName FROM tree_cte;
CustName
----------
顶级客户
2级客户1
2级客户2
2级客户3
2级客户4
3级客户1
3级客户2
3级客户1
3级客户2
假如那个参数 顶级员工 修改为 2级员工1
结果为:
CustName
----------
2级客户1
2级客户2
3级客户1
3级客户2
3级客户1
3级客户2
(6 行受影响)
-- 用户表有DepID关联Dep表中的ID主键,表示这个用户是这个部门的。
CREATE TABLE t_Users (
UserID INT PRIMARY KEY,
DepID INT,
UserNAME VARCHAr(10)
)
GO
-- 部门表
-- 部门表有UpID关联同一个表中的主键,表示这个部门的上级部门。
CREATE TABLE t_Dep (
DepID INT PRIMARY KEY,
UpID INT,
DepNAME VARCHAr(10)
)
GO
-- 客户表
-- 客户表有UserID关联Users表中的ID主键,表示这个客户属于这个用户的。
CREATE TABLE t_Cust (
CustID INT PRIMARY KEY,
UserID INT,
CustName VARCHAr(10)
)
GO
INSERT INTO t_Dep
SELECt 1, NULL, '顶级部门' UNIOn ALL
SELECT 2, 1, '2级部门1' UNIOn ALL
SELECT 3, 1, '2级部门2' UNIOn ALL
SELECT 4, 2, '3级部门1' UNIOn ALL
SELECT 5, 2, '3级部门2'
GO
INSERT INTO t_Users
SELECT 1, 1, '顶级员工' UNIOn ALL
SELECT 2, 2, '2级员工1' UNIOn ALL
SELECT 3, 2, '2级员工2' UNIOn ALL
SELECT 4, 3, '2级员工3' UNIOn ALL
SELECT 5, 3, '2级员工4' UNIOn ALL
SELECT 6, 4, '3级员工1' UNIOn ALL
SELECT 7, 4, '3级员工2'
GO
INSERT INTO t_Cust
SELECT 1, 1, '顶级客户' UNIOn ALL
SELECT 2, 2, '2级客户1' UNIOn ALL
SELECT 3, 3, '2级客户2' UNIOn ALL
SELECT 4, 4, '2级客户3' UNIOn ALL
SELECT 5, 5, '2级客户4' UNIOn ALL
SELECT 6, 6, '3级客户1' UNIOn ALL
SELECT 7, 7, '3级客户2'
GO
WITH
dep_cus_cte
AS(
SELECT
t_Dep.DepID,
t_Dep.UpID,
t_Cust.CustName
FROM
t_Dep
JOIN t_Users
ON (t_Dep.DepID = t_Users.DepID)
JOIN t_Cust
ON (t_Users.UserID = t_Cust.UserID)
) ,
tree_cte
AS (
SELECt
DepID,
CustName
FROM
dep_cus_cte
WHERe
DepID IN (SELECt DepID FROM t_Users t WHERe t.UserNAME = '顶级员工' )
UNIOn ALL
SELECt
dep_cus_cte.DepID,
dep_cus_cte.CustName
FROM
tree_cte
JOIN dep_cus_cte
ON (tree_cte.DepID = dep_cus_cte.UpID)
)
SELECt CustName FROM tree_cte;
CustName
----------
顶级客户
2级客户1
2级客户2
2级客户3
2级客户4
3级客户1
3级客户2
3级客户1
3级客户2
假如那个参数 顶级员工 修改为 2级员工1
结果为:
CustName
----------
2级客户1
2级客户2
3级客户1
3级客户2
3级客户1
3级客户2
(6 行受影响)
全部回答
- 1楼网友:妄饮晩冬酒
- 2021-01-02 23:53
SELECt * FROM CUST WHERe USERID IN (SELECt USERID FROM USERS A WHERe EXISTS (SELECt 1 FROM USERS B WHERe B.DEPID = A.DEPID AND B.USERID = '用户编号'))
这个语句就会查询出结果了。
IN后边查询的是这个用户所在部门的所有用户。
- 2楼网友:怙棘
- 2021-01-02 22:46
select * from 客户表 where 客户表.userID in (select 用户表.userID from 用户表 where 用户表.DepID in (select 部门表.DepID from 部门表 where 部门表.depId = (select 用户表.depID from 用户表 where 用户表.用户名='这个用户')))
- 3楼网友:woshuo
- 2021-01-02 21:10
其实照你上面描述,不用部门表(Dep)这个表
select * from Cust
where UserID in
(select a.ID from Users a,Users B where a.DepID=b.DepID and b.ID= '用户编号') --选出这个部门的所有人员的ID号。
【有疑问可以HI我,或追问,但请不要关闭问题,谢谢!】
- 4楼网友:夜余生
- 2021-01-02 20:56
正确
以这句select distinct depnum from user where uid=any(select distinct userid from book)
比如 user 表有数据 (uid,depnum){(1,'aa'),(3,'bb'),(2,'cc')}这样三个数据
book id{1,2,1,}这个三个数据,select distinct userid from book取出的数据就是1,2
any表示只要有uid与之进行比较一个相同就取出 结果(1,'aa')(2,'cc')
以此类推得到最后结果
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯