SQL:当行是另一个表中的外键时,查找表中的所有行

时间:2017-09-12 02:50:01

标签: sql

这里的警告是我必须使用以下工具完成此操作:

  1. 基本的SQL构造:SELECT FROM .. AS WHERE..。区别不错。

  2. 设置运算符:UNION, INTERSECT, EXCEPT

  3. 创建临时关系:CREATE VIEW... AS ...

  4. <, >, <=, ==等算术运算符

  5. 子查询只能在NOT IN或减法操作的上下文中使用。即(select ... from... where not in (select..。)

  6. 我不能使用任何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))
    

    有没有办法通过使用不在或我可以使用的其他方法来解决这个问题?几个小时我一直在努力。如果有人可以帮助解决这个愚蠢的障碍,我很乐意提出你的答案并选择你的答案。

3 个答案:

答案 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)