【问题标题】:How to select something from sql with an or condition and a count?如何从带有或条件和计数的sql中选择一些东西?
【发布时间】:2021-01-15 22:50:36
【问题描述】:

表格:

  • 学生(SNUM:整数,SNAME:STRING,专业:STRING)
  • CLASS(CNAME: STRING,MEETS_AT:STRING,ROOM:STRING,FID:INTEGER)
  • 已注册(SNUM: 整数,CNAME: STRING)

任务:

找出在 R128 房间开会或有五个或更多学生注册的所有班级的名称。

您将如何编写 SQL 语句以包含上述两个条件?我可以在两个 SQL 语句中做到这一点:

SELECT CNAME
FROM   ENROLLMENT
GROUP BY CNAME
HAVING COUNT(CNAME) > 5
SELECT CNAME
FROM CLASS
WHERE ROOM = 'R128'

但是我怎样才能将这些合并到一个语句中呢?

【问题讨论】:

  • 在有子句中添加 OR CNAME = "R128"
  • 我试过了,但它确实过滤了我的 ϹΟՍΝΤ(ϹΝΑΜΕ) > 5. 我有点需要联合
  • 你添加或在有或在哪里?
  • 我编辑我的问题以更好地解释我真正想要完成的事情。我需要以某种方式涉及两个实体 ϹⅬΑЅЅ 和 ΕΝRΟⅬⅬΜΕΝΤ 以获得正确答案

标签: sql count subquery where-clause having-clause


【解决方案1】:

您可以将包含聚合的条件与 OR 运算符一起添加到 HAVING 子句:

ЅΕLΕCΤ e.CΝΑΜΕ
  FRΟΜ CLASS c
  JOIN ENROLLMENT e
    ON e.CΝΑΜΕ = c.CΝΑΜΕ
 GRΟՍΡ ΒY e.CΝΑΜΕ
HAVING COUNT(e.CΝΑΜΕ) >= 5 
    OR SUM(CASE WHEN c.ROOM='R128' THEN 1 ELSE 0 END)>0

【讨论】:

  • 我需要同时涉及实体 ϹⅬΑЅЅ 和 ΕΝRΟⅬⅬΜΕΝΤ
  • 但您要的是这个 ҒΙΝⅮ ΤΗΕ ΝΑΜΕЅ ΟҒ ΑⅬⅬ ϹⅬΑЅЅΕЅ 在问题中 ... @christina.y.weaver 和 ΕΝRΟⅬⅬΜΕΝΤ3 列已经有 @927654 .
  • 是的,所有在 R128 房间开会的班级或所有超过 5 名学生的班级
  • 注意到ROOM列在CLASS表中,添加了一个join语句@christina.y.weaver
  • 这只产生与ЅΕⅬΕϹΤ ϹΝΑΜΕ ҒRΟΜ ΕΝRΟⅬⅬΜΕΝΤ ԌRΟՍΡ ΒҮ ϹΝΑΜΕ ΗΑⅤΙΝԌ ϹΟՍΝΤΜ5(ϹΟՍΝΤΜ5
【解决方案2】:

我会在where 子句中直接过滤来写这个:

select cname
from class c
where
    room = 'R128'
    or (select count(*) from enrolled e where e.cname = c.cname) > 5

【讨论】:

  • 我试过这个,但我没有得到我的两个请求的联合。我得到了不同的东西
  • 如果你想要满足两个条件的类,那么使用and而不是or
  • 当我使用 AND 我只得到这个查询的结果ЅΕⅬΕϹΤ ϹΝΑΜΕ ҒRΟΜ ϹⅬΑЅЅ WΗΕRΕ RΟΟΜ = 'R128'
  • five or more。所以这里的条件应该是>= 5。但除此之外,我认为这是正确的答案。
【解决方案3】:
SELECT CNAME
FROM   ENROLLMENT
GROUP BY CNAME
HAVING COUNT(CNAME) > 5 
UNION
SELECT CNAME
FROM CLASS
WΗΕRΕ RΟΟΜ = 'R128'

这样你可以将两个不同的数据合并在一起

【讨论】:

    猜你喜欢
    • 2017-01-31
    • 2023-03-08
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2023-04-03
    相关资源
    最近更新 更多