【问题标题】:SQL查询查找教过每一门学科的教师
【发布时间】:2023-03-31 04:32:01
【问题描述】:

我需要编写一个 SQL 查询来查找教授每门学科的教师(即 Sam)

  1. 使用嵌套查询
  2. 不使用聚合函数(无计数、平均值、最小值等)。

我似乎无法弄清楚,非常感谢一些帮助 =)

教师

fid fname fqualifications fexperience salary deptname
100 Sam ME CS 10 100000 IT
101 John ME IT 8 80000 IT
102 Max ME CS 9 90000 CS
103 Jenny ME CS 5 50000 CS

课程

cid cname semester
1 SE 4
2 WT 4
3 CG 5
4 DBMS 5

教导

fid cid year
100 1 2019
100 2 2018
100 3 2020
100 4 2021
101 1 2017
101 2 2018
102 2 2018
102 3 2019
103 3 2020
103 4 2021

我使用此查询查找输出,但根据问题我不能。

select * from faculty f
    -> inner join teaches t
    -> on f.fid=t.fid
    -> inner join course c
    -> on t.cid=c.cid
    -> group by f.fid,f.fname
    -> having count(*)=4;

输出:

fid fname fqualifications fexperience salary deptname fid cid year cid cname semester
100 Sam ME CS 10 100000 IT 100 1 2019 1 SE 4

【问题讨论】:

    标签: sql database aggregate-functions nested-query


    【解决方案1】:

    这不是最有效的方法,但根据给定的要求,我会尝试将查询改写如下:

    “教授所有科目的教师是没有跳过一门学科的教师”。

    现在, 跳过一个科目的院系在 LEFT JOIN 与教学大纲和 所有 科目时将有一个 NULL。伪SQL:

    SELECT DISTINCT faculty.id FROM faculties 
        LEFT JOIN has_taught ON (has_taught.faculty_id = faculty.id)
        LEFT JOIN subjects ON (has_taught.subject_id = subjects.id)
        WHERE has_taught.faculty_id IS NULL;
    

    或者在某些数据库中你可能需要

    SELECT DISTINCT faculty.id FROM faculties 
        CROSS JOIN subjects
        LEFT JOIN has_taught ON 
          (has_taught.faculty_id = faculty.id AND has_taught.subject_id = subjects.id)
        WHERE has_taught.faculty_id IS NULL;
    

    所以,NOT IN 这个名单的院系自然会是

    SELECT * FROM faculties
        WHERE faculty.id NOT IN (
            SELECT DISTINCT faculty.id ...
        );
    

    这应该只根据要求使用嵌套查询。

    或者进一步加入

    SELECT faculties.* FROM faculties
        LEFT JOIN (
            SELECT DISTINCT faculty.id ...
        ) AS they_skipped_some
        ON (they_skipped_some.id = faculties.id)
        WHERE they_skipped_some.id IS NULL
    

    【讨论】:

    • 非常感谢您的回复,但我担心这不是我要找的。第一部分返回没有教过单一学科的教师,最后的嵌套查询返回不属于此列表的教师,即(教过一门学科)。问题是我正在寻找教过每个科目的教师,当前查询返回所有科目。
    • 你试过CROSS JOIN 版本吗?我看不出它是如何工作的,因为 CROSS JOIN 应该如何返回两个表的完整笛卡尔积。
    猜你喜欢
    • 2021-12-21
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多