SQL - смешивание AND и OR - PullRequest
       32

SQL - смешивание AND и OR

3 голосов
/ 24 февраля 2010

Я не эксперт по SQL. Я использую SQL Server 2005 и пытаюсь понять, как структурировать запрос так, чтобы он удовлетворял нескольким требованиям. У меня есть две таблицы, определенные следующим образом:

Classroom
 - ID
 - DepartmentID
 - TeacherName
 - RoomNumber

Student
 - ID
 - Name
 - ClassroomID

Я пытаюсь создать запрос, который говорит: «Дайте мне классные комнаты в отделе [x] ИЛИ отделе [y], в которых обучается более 30 человек, И дайте мне классные комнаты в отделе [w] ИЛИ отделе [z] у меня более 40 студентов. Я не совсем понимаю, как правильно смешать AND и OR в моем SQL. В настоящее время я пытаюсь сделать следующее:

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)

Что я делаю не так? Спасибо!

Ответы [ 4 ]

4 голосов
/ 24 февраля 2010
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
4 голосов
/ 24 февраля 2010

Вам необходимо добавить набор скобок вокруг первых двух логических выражений, которые объединяются AND

должно быть

(...) OR
(...) 

и т.д.

1 голос
/ 24 февраля 2010

Попробуйте это

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

вместо этого

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

;]

0 голосов
/ 24 февраля 2010

Будьте очень откровенны со своими паренями.

Обратите внимание, что я добавил еще 3 комплекта паренов.

((c.[DepartmentID]=5) AND ((SELECT COUNT(*) FROM Student s WHERE s.ClassroomID=c.ID) > 30)) OR
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...