SQL - 连接多个表时选择行

时间:2014-11-20 13:13:48

标签: sql postgresql join

我有3张桌子:

用户 / 中间表 / 部门

中间表和用户是多对一的。 中间表和部门也是多对一的。

如何只获得部门,哪个是多个用户。

| USER |    | MIDDLE TABLE |    |  DEPARTMENT  |
|------|    |--------------|    |--------------|
|id    |----| id           |----| id           |
|      |    | user_id      |    |              |
|      |    | department_id|    |              |

编辑:用户不能是同一个用户。在这种结构中,可以在一个部门中多次使用一个用户。

| USER   |    | MIDDLE TABLE          |    |  DEPARTMENT  |
|--------|    |-----------------------|    |--------------|
| id |1|2|----| id            |1|2|3|4|----| id |1|2|     |
|        |    | user_id       |1|1|2|1|    |              |
|        |    | department_id |1|1|2|2|    |              |

现在我想只获得部门ID:2

2 个答案:

答案 0 :(得分:2)

这是一个简单的group by查询:

select department_id
from middle_table
group by department_id
having count(distinct user_id) > 1;

如果用户只能分配给一个部门,那么中间表中的id列就没用了,您应该将(user_id, department_id)作为该表的主键。

如果您还需要部门信息,可以加入:

select d.*
from department d
join (
  select department_id
  from middle_table
  group by department_id
  having count(distinct user_id) > 1
) sd on sd.department_id = d.department_id;

答案 1 :(得分:0)

获取部门表中有超过1名员工的字段

 SELECT Department.*
 FROM Department WHERE Department.ID IN (
     SELECT department_id
     FROM Middle_table
     GROUP BY Department_id
     HAVING COUNT(user_id) > 1 )