【问题标题】:Where, either or not both clause SQLwhere, either or not both 子句 SQL
【发布时间】:2013-04-23 22:07:38
【问题描述】:

我正在尝试列出在秋季学期注册了至少一门课程或在春季学期注册了至少一门课程的学生,但不能同时注册两者。我试图从不同的角度去解决这个问题,但到目前为止我还没有成功。我觉得完成此解决方案的代码如下。任何帮助表示赞赏!

SELECT enrolled.StudentID, student.LastName, student.FirstName
   , enrolled.courseID, enrolled.Quarter  
FROM enrolled 
INNER JOIN student ON enrolled.studentID = student.SID
GROUP BY enrolled.StudentID, student.LastName, student.FirstName
   , enrolled.courseID, enrolled.Quarter
HAVING (count(distinct enrolled.Quarter) = 1)

【问题讨论】:

  • 如果您从 group by Alone 中删除 registered.Quarter,则会为不正确的 group by 给出错误。如果我从 SELECT 中删除了 registered.Quarter ,同时也从 GroupBy 中删除了,我仍然会得到所有行。

标签: mysql sql count having having-clause


【解决方案1】:

Stouny 的评论是正确的,从 group by 中删除 quarter 并在 select 中使用聚合器将起作用:

SELECT enrolled.StudentID, student.LastName, student.FirstName, enrolled.courseID, max(enrolled.Quarter) as quarter
FROM enrolled 
INNER JOIN student ON enrolled.studentID = student.SID
GROUP BY enrolled.StudentID, student.LastName, student.FirstName, enrolled.courseID
HAVING count(*) = 1

如果您有很多季度要检查,另一种方法无法很好地扩展,但适用于 2:

SELECT enrolled.StudentID, student.LastName, student.FirstName, coalesce(spring.courseID, fall.courseID), coaleasce(spring.Quarter, fall.quarter)  
FROM students
LEFT OUTER JOIN enrolled as spring ON spring.studentId = students.sid and spring.quarter = 'spring'
LEFT OUTER JOIN enrolled as fall ON fall.studentId = students.sid and fall.quarter = 'fall'
WHERE (spring.courseID != NULL and fall.courseID = NULL) OR (spring.courseID ! NULL and fall.courseID != NULL)

【讨论】:

  • Patricks 的建议很有效,对于我的数据库有多小没有任何复杂性
【解决方案2】:

您可以使用以下几行:

 SELECT 
   enrolled.StudentID, student.LastName, 
   student.FirstName, enrolled.courseID, enrolled.Quarter  
 FROM enrolled
 where StudentID in ( 
     SELECT StudentID 
     FROM enrolled where quarter in ( 'fall', 'spring' )
     group by StudentID
     having count(*) = 1 
   )      

【讨论】:

  • 这种方法类似于我尝试完成的第一种方法。当涉及到 student.LastName,student.FirstName 时,代码需要稍微清理一下,但它给了我想要的答案。谢谢
【解决方案3】:

我会做一个联合查询。

select yourfields
from enrolled
where studentid in
(select studentid
from enrolled 
where quarter = 'fall'
minus
select studentid
from enrolled 
where quarter = 'spring')

union all
select yourfields
from enrolled
where studentid in
(select studentid
from enrolled 
where quarter = 'spring'
minus
select studentid
from enrolled 
where quarter = 'fall')

不完全确定 MySQL 是否支持关键字减号。有些分贝会,有些不会。如果不是,它可能支持关键字 except。

【讨论】:

    【解决方案4】:

    抱歉,我的电话无法完整回答。

    我会试试的

    Select [what you want]
    From students as s
    Outer apply
    (
    Select distinct sid 
    From enrolled as e
    Where e.sid =s.sid
    And quorter = 1
    ) as q1
    Outer apply
    (
     Select distinct sid 
    From enrolled as e
    Where e.sid =s.sid
    And quorter = 2
    ) as q2
    Where
    ((  q1.sid  is null and q2.sid is not null)
    Or 
    ( q1.sid is not null and q2.sid is null))
    And (q1.sid is not null and q2.sid is not null)
    

    【讨论】:

    • 感谢您的清理,我已将其格式化,但当我点击提交时却被撞到一起。
    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2020-11-28
    • 2019-05-18
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多