【问题标题】:SQL - Mixing ANDs and ORsSQL - 混合 AND 和 OR
【发布时间】:2010-02-24 16:56:26
【问题描述】:

我不是 SQL 专家。我正在使用 SQL Server 2005,并试图弄清楚如何构造查询,以便它可以满足多个要求。我有两个表定义如下:

Classroom
 - ID
 - DepartmentID
 - TeacherName
 - RoomNumber

Student
 - ID
 - Name
 - ClassroomID

我正在尝试构建一个查询,“给我部门 [x] 的教室或部门 [y] 有超过 30 名学生的教室,并给我部门 [w] 或部门 [z] 的教室有 40 多个学生。我对如何在我的 SQL 中正确混合 AND 和 OR 感到困惑。目前,我正在尝试以下方法:

SELECT
  c.RoomNumber,
  c.TeacherName
FROM
  Classroom c
WHERE
  c.[DepartmentID]=5 AND (SELECT COUNT(*) FROM Student s WHERE s.ClassroomID=c.ID > 30) OR
  c.[DepartmentID]=6 AND (SELECT COUNT(*) FROM Student s WHERE s.ClassroomID=c.ID > 30) OR
  c.[DepartmentID]=7 AND (SELECT COUNT(*) FROM Student s WHERE s.ClassroomID=c.ID > 40) OR
  c.[DepartmentID]=8 AND (SELECT COUNT(*) FROM Student s WHERE s.ClassroomID=c.ID > 40)

我做错了什么?谢谢!

【问题讨论】:

    标签: sql database sql-server-2005


    【解决方案1】:
    SELECT  c.id
    FROM    Classroom c
    JOIN    Students s
    ON      s.Classroom = c.Id
    WHERE   DepartmentID IN ('X', 'Y', 'W', 'Z')
    GROUP BY
            c.id, c.DepartmentID
    HAVING  COUNT(*) >= CASE WHEN DepartmentID IN ('X', 'Y') THEN 30 ELSE 40 END
    

    【讨论】:

      【解决方案2】:

      您需要在前两个由 AND 连接的布尔表达式周围添加一组括号

      应该是

      (...) OR
      (...) 
      

      【讨论】:

        【解决方案3】:

        试试这个

        (SELECT COUNT(*) FROM Student s WHERE s.ClassroomID=c.ID) >30
        

        而不是这个

        (SELECT COUNT(*) FROM Student s WHERE s.ClassroomID=c.ID > 30)
        

        ;]

        【讨论】:

          【解决方案4】:

          你的括号要非常明确。

          请注意,我又添加了 3 组括号。

          ((c.[DepartmentID]=5) AND ((SELECT COUNT(*) FROM Student s WHERE s.ClassroomID=c.ID) > 30)) OR
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-06-22
            • 1970-01-01
            • 2018-06-03
            • 2016-04-13
            • 2011-03-10
            • 1970-01-01
            • 2017-01-11
            • 2017-06-27
            相关资源
            最近更新 更多