问题描述
表格:
- 学生( SNUM:整数,SNAME:STRING,主要:STRING)
- CLASS( CNAME: STRING,MEETS_AT:STRING,ROOM:STRING,FID:INTEGER)
- 已注册( SNUM: INTEGER, CNAME: STRING)
任务:
查找在R128会议室开会或已招收五名或以上学生的所有班级的名称。
您如何编写包含上述两个条件的sql语句?我能够通过两个sql语句来做到这一点:
SELECT CNAME
FROM ENROLLMENT
GROUP BY CNAME
HAVING COUNT(CNAME) > 5
SELECT CNAME
FROM CLASS
WHERE ROOM = 'R128'
但是如何将它们合并为一条语句?
解决方法
我会在where
子句中使用直接过滤来编写此代码:
select cname
from class c
where
room = 'R128'
or (select count(*) from enrolled e where e.cname = c.cname) > 5
,
您可以将包含聚合条件的条件与OR
运算符一起添加到HAVING子句中:
ЅΕLΕCΤ e.CΝΑΜΕ
FRΟΜ CLASS c
JOIN ENROLLMENT e
ON e.CΝΑΜΕ = c.CΝΑΜΕ
GRΟՍΡ ΒY e.CΝΑΜΕ
HAVING COUNT(e.CΝΑΜΕ) >= 5
OR SUM(CASE WHEN c.ROOM='R128' THEN 1 ELSE 0 END)>0
,
SELECT CNAME
FROM ENROLLMENT
GROUP BY CNAME
HAVING COUNT(CNAME) > 5
UNION
SELECT CNAME
FROM CLASS
WΗΕRΕ RΟΟΜ = 'R128'
这样,您可以将2个不同的数据合并在一起