我有3张桌子
队
id name
6 WD
7 LGO
10 PS
11 EM
12 SO
13 DM
14 DMS
15 CRO
16 T / T
team_mapping
id team_id parent_team_id
1 6 0
2 7 0
3 10 7
4 11 7
5 12 0
6 13 12
7 14 12
8 15 0
9 16 15
员工
id name team_id
3 Bk 6
4 Nr 6
5 SV 7
6 GK 10
7 JPD 13
8 BSY 16
9 MK 16
10 Ps 16
11 Bji 16
我的查询是
SELECT t.*
FROM teams t
INNER JOIN employees e ON t.id = e.team_id
INNER JOIN team_mapping tm ON t.id = tm.team_id
WHERE tm.parent_team_id = '0'
GROUP BY t.id
显示为
id name
6 WD
7 LGO
但我希望仅在父母团队或子团队中至少有一名员工时才显示父团队名称。即输出
team_id name
6 WD
7 LGO
12 SO
15 CRO
请帮我写一个查询,输出应该显示为上面的结果
由于
答案 0 :(得分:0)
这是您的查询应该是什么样的
SELECT DISTINCT CAST(t.id AS INT) id,t.name
FROM teams t
LEFT JOIN employees e ON t.id = e.team_id
LEFT JOIN team_mapping tm ON t.id = tm.team_id
WHERE tm.parent_team_id = '0'
您可以使用LEFT JOIN进行查询。
然后我删除了GROUP BY子句并将其替换为DISTICNT。
我只是使用CAST(t.id AS INT)id,所以结果将被安排,无论哪种方式你都可以删除演员表,唯一的区别是结果的排列。
答案 1 :(得分:0)
select distinct id, name
from teams t inner join
(SELECT case when tm.parent_team_id = 0 then tm.team_id else tm.parent_team_id end as TID
FROM teams t
INNER JOIN team_mapping tm ON t.id = tm.team_id
INNER JOIN employees e ON tm.team_id = e.team_id ) as table2
on t.id = table2.TID
此代码位于SQL Server
中此处子查询返回重复值,我们不能对case语句使用distinct。要避免重复值并获取父团队名称,需要使用子查询进行内部联接