【问题标题】:What is the alternative for ALL and EVERY in SQLite?SQLite 中 ALL 和 EVERY 的替代方案是什么?
【发布时间】:2021-03-18 07:35:35
【问题描述】:

嘿,我是 SQL 新手,我正在尝试在 sqliteonline.com 上使用 SQLite 查找注册最多课程的学生的姓名

这些是关系:

这就是我所拥有的:

SELECT S.sname
FROM Student S
WHERE S.snum IN (SELECT E.snum
                 FROM Enrolled E
                 GROUP BY E.snum
                 HAVING COUNT (*) >= ALL (SELECT COUNT (*)
                 FROM Enrolled E2
                 GROUP BY E2.snum ))

这是我得到的错误:

我猜测 ALL 关键字在 SQLite 中不存在或使用方式不同,所以我想知道接下来我应该做什么。

EVERY 关键字也有同样的问题。

我要解决的问题: 对于仅在 R128 房间教过课的每位教员,打印教员 成员的姓名和她或他教过的课程总数。

我有什么:

SELECT F.fname, COUNT(*) AS CourseCount
FROM Faculty F, Class C
WHERE F.fid = C.fid
GROUP BY F.fid, F.fname
HAVING EVERY ( C.room = "R128" )

我得到了什么:

【问题讨论】:

    标签: sql sqlite count subquery inner-join


    【解决方案1】:

    您可以使用ORDER BYLIMIT

    SELECT S.sname
    FROM Student S
    WHERE S.snum IN (SELECT E.snum
                     FROM Enrolled E
                     GROUP BY E.snum
                     HAVING COUNT(*) = (SELECT COUNT(*)
                                        FROM Enrolled E2
                                        GROUP BY E2.snum 
                                        ORDER BY COUNT(*) DESC
                                        LIMIT 1
                                       )
                    );
    

    注意:查询逻辑还有其他表达方式。这专门解决了您提出的问题。

    【讨论】:

      【解决方案2】:

      一个选项使用窗口函数:

      select s.name
      from student s
      inner join (
          select snum, rank() over(order by count(*) desc) rn
          from enrolled e
          group by snum
      ) e on e.snum = s.snum
      where rn = 1
      

      如果您的 SQLite 版本不支持窗口函数(在 3.25 版中添加),我建议使用 having 子句进行连接和过滤:

      select s.name
      from students s
      inner join enrolled e on e.snum = s.snum
      group by s.snum, s.name
      having count(*) = (
          select count(*)
          from enrolled
          group by snum
          order by count(*) desc limit 1
      )
      

      【讨论】:

        猜你喜欢
        • 2021-11-13
        • 2018-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-29
        • 1970-01-01
        相关资源
        最近更新 更多