这里的警告是我必须使用以下工具完成此操作:
基本的SQL构造:SELECT FROM .. AS WHERE..
。区别不错。
设置运算符:UNION, INTERSECT, EXCEPT
创建临时关系:CREATE VIEW... AS ...
<, >, <=, ==
等算术运算符
子查询只能在NOT IN
或减法操作的上下文中使用。即(select ... from... where not in (select..
。)
我不能使用任何join, limit, max, min, count, sum, having, group by, not exists, any exists, count, aggregate
函数或上面1-5中未列出的任何其他函数。
模式:
People (id, name, age, address)
Courses (cid, name, department)
Grades (pid, cid, grade)
我对查询感到满意,但我使用的不存在(我不能使用)。下面的sql只显示了参加Courses表中每个课程的人:
select People.name from People
where not exists
(select Courses.cid from Courses
where not exists
(select grades.cid from grades
where grades.cid = courses.cid and grades.pid = people.id))
有没有办法通过使用不在或我可以使用的其他方法来解决这个问题?几个小时我一直在努力。如果有人可以帮助解决这个愚蠢的障碍,我很乐意提出你的答案并选择你的答案。
答案 0 :(得分:0)
正如Nick建议的那样,在这种情况下你可以使用EXCEPT。以下是样本:
select People.name from People
EXCEPT
select People.name from People AS p
join Grades AS g on g.pid = p.id
join Courses as c on c.cid = g.cid
答案 1 :(得分:0)
您可以使用常量值将第一个not in
转换为select *
from People a
where 1 not in (
select 1
from courses b
...
。
{{1}}
答案 2 :(得分:0)
正如Nick.McDermaid所说,您可以使用except
来识别缺少课程的学生,并not in
将其排除在外。
1获取完整列表,其中包含people x courses
的笛卡尔积。如果每个学生都参加了每门课程,这就是grades
的样子。
create view complete_view as
select people.id as pid, courses.id as cid
from people, courses
2使用except
来识别至少缺少一个班级的学生
create view missing_view as select distinct pid from (
select pid, cid from complete_view
except
select pid, cid from grades
) t
3使用not in
选择不缺课的学生
select * from people where id not in (select pid from missing_view)