sql查找所有实例都属于不同组

时间:2017-07-23 22:35:10

标签: sql function subquery aggregate distinct

我确定已经有人问过并回答了类似的问题,但我还没有找到任何搜索内容,请保持温和。

我想知道数据库中教师的所有名字,他们在建筑物的每个房间里教书。这些表非常简单,但它们是:

class:
+--------+---------+------+------+
| cname  | meetsat | room | fid  |
+--------+---------+------+------+
| class  | 8       | R128 |    5 |
| class2 | 9       | R129 |    6 |
| class3 | 9       | R128 |    5 |
+--------+---------+------+------+

faculty:
+-----+---------------+--------+
| fid | fname         | deptid |
+-----+---------------+--------+
|   5 | i.teach       |    999 |
|   6 | other guy     |    998 |
|   8 | another woman |    997 |
+-----+---------------+--------+

到目前为止,通过与其他用户的讨论,我有:

(SELECT f.fname
FROM faculty f, class c
WHERE f.fid = c.fid)
UNION
(select c.fid
from class c
group by c.fid
having count(distinct room) = (select count(distinct c2.room) from class 
c2));

当前输出:     + ----------- +     | fname |     + ----------- +     | i.teach |     |其他人|     + ----------- +

期望的输出应该是:

+---------+
| fname   |
+---------+
| i.teach |
+---------+

我想我只需要正确加入。我所拥有的课程资料非常简陋,在概念教学方面并不多,所以我不知道在不同的情况下应用它们的人。

3 个答案:

答案 0 :(得分:1)

您正在寻找having

select c.fid
from class c
group by c.fid
having count(distinct c.room) = (select count(distinct c2.room) from class c2);

获取名称只需加入faculty表。

答案 1 :(得分:1)

这是一个可以执行您需要的查询,实现比较计数的算法。它是Gordon发布的HAVING的替代品

SELECT * FROM

  (SELECT count(distinct room) as countAllRooms FROM class) ar
  INNER JOIN
  (SELECT c.fid, count(distinct c.room) as countRoomsPerTeacher FROM class c GROUP BY c.fid) rpt
  ON
    rpt.countRoomsPerTeacher = ar.countAllRooms


  INNER JOIN 
  faculty f
  ON
    f.fid = rpt.fid

关于您对Gordon答案的查询,加入教师表的最安全方式:

Select * from faculty inner join 
(
select c.fid
from class C
group by c.fid
having count(distinct room) = (select count(distinct c2.room) from class c2)
) ff 
on ff.fid = faculty.fid

我通常不会格式化这样的sql,但我故意这样做是为了显示我添加的位和哪些位是Gordon的

你应该避免尝试将他的教师表加入到进行分组的内部查询中,因为它会强制你在选择列表中添加更多列,这会强制你向你的组添加更多列,这会打破你的计数,更好地考虑戈登的查询“教师发现者”,作为子查询孤立运行,并在以后加入

答案 2 :(得分:0)

内部加入怎么样,或者我不明白你的问题。

Select f.name from faculty f inner join class c on f.fid=c.fid