1

我正在尝试使用 sqliteonline.com 编写一个 SQLite 查询,它可以:

找出在教授某些课程的每个房间中任教的教职员工的姓名。

以下是关系: 在此处输入图像描述

这就是我所拥有的:

SELECT DISTINCT F.fname
FROM Faculty F
WHERE NOT EXISTS (( SELECT *
                    FROM Class C )
                    EXCEPT
                   (SELECT C1.room
                    FROM Class C1
                    WHERE C1.fid = F.fid ))    

这是我得到的错误:

在此处输入图像描述

我已经仔细检查过,括号是平衡的。所以我有点困惑从这里去哪里。


4

3 回答 3

2

这看起来像是一个关系划分问题。我会用一种规范的方法来解决这个问题,使用连接和聚合:

select fname
from faculty f
inner join class c on c.fid = f.fid
group by fname
having count(distinct c.room) = (select count(distinct room) from class)
于 2020-12-06T21:19:45.217 回答
1

问题是select *. 只需在 两侧选择相同的列except

SELECT F.fname
FROM Faculty F
WHERE NOT EXISTS (SELECT c.Room
                  FROM Class C
                  EXCEPT
                  SELECT C1.room
                  FROM Class C1
                  WHERE C1.fid = F.fid
                 )

注意:您可能应该选择的不仅仅是名字。中的行Faculty应该是唯一的。

于 2020-12-06T21:04:39.733 回答
1

您必须删除包围每个子查询的括号,并在每个子查询中选择相同的列(我猜只room需要):

SELECT F.fname
FROM Faculty F
WHERE NOT EXISTS ( SELECT room FROM Class C 
                   EXCEPT
                   SELECT C1.room
                   FROM Class C1
                   WHERE C1.fid = F.fid 
                 )

也不DISTINCT是真的需要,因为您正在fnameFaculty.

于 2020-12-06T21:15:01.913 回答