【问题标题】:I'm trying to learn sqlite queries but keep getting this error我正在尝试学习 sqlite 查询,但不断收到此错误
【发布时间】:2020-12-06 21:01:39
【问题描述】:

我正在尝试使用 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 ))    

这是我得到的错误:

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


【问题讨论】:

    标签: sql sqlite subquery relational-database sql-except


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

      您必须删除包围每个子查询的括号并在每个子查询中选择相同的列(我猜只需要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 也不是真正需要的,因为您正在从Faculty 中选择唯一的(我相信)fnames。

      【讨论】:

        【解决方案3】:

        问题是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 中的行应该是唯一的。

        【讨论】:

        • 您好,感谢您的快速回复。所以我刚刚输入了你的答案,但我仍然遇到同样的错误。
        • @PeterShepherd 。 . . SQLite 不喜欢多余的括号。
        猜你喜欢
        • 2022-06-18
        • 2019-09-23
        • 2023-04-02
        • 2013-05-09
        • 1970-01-01
        • 2021-02-16
        • 1970-01-01
        • 1970-01-01
        • 2014-10-21
        相关资源
        最近更新 更多