SQL-父团队名称显示取决于子团队至少一名员工

时间:2017-04-27 03:39:44

标签: sql postgresql

我有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

请帮我写一个查询,输出应该显示为上面的结果

由于

2 个答案:

答案 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。要避免重复值并获取父团队名称,需要使用子查询进行内部联接