2012-04-30 3 views
3

ОК, так что запрос я хотел бы решить:SQL - несколько строк в HAVING условия

Я хотел бы выразить следующие бизнес-правило:

Показать группы (для конкретного учебника (tutorialID) и неделя (неделя)), которые требуют дополнительных обзоров.

Так что в основном мне нужно определить количество членов в группе, тогда мне нужно собрать все просмотры scrum для этой недели и этой группы и посмотреть, равна ли эта сумма количеству членов в группе. Если это так, это означает, что все участники были просмотрены на этой неделе, и поэтому их не нужно отображать.

Предположения: Участник может быть просмотрен только раз в неделю.

Я попытался следующий SQL, однако я получаю следующую ошибку Subquery returns more than 1 row

SELECT groupName, g.groupId 
FROM `student` s, `group` g 
WHERE s.GroupId = g.GroupId 
AND s.GroupId IS NOT NULL 
AND s.tutorialId = 2 
GROUP by s.GroupId 
AND s.GroupID = (
    SELECT GroupId 
    FROM student 
    GROUP BY GroupId 
    HAVING count(*)> (
     SELECT count(*) 
     FROM scrumreview r, student s 
     WHERE r.reviewee = s.studentID 
     GROUP BY GroupId  
     AND r.week = 5 
     ) 
    ) 

Student enter image description here

scrumreview enter asdasddescription here

группу enter image description here

+0

добавлен в Group By во внутреннем наиболее подзапросом – dgamma3

ответ

3

Ваш внутренний запрос (начиная с строки 8) возвращает несколько groupid s. Оператор равенства = сравнивает 1-к-1, но вы хотите сравнить 1-ко-многим, что вы можете сделать с IN.

Таким образом, чтобы исправить это, в строке 7 изменить код от этого ...

AND s.GroupID = (

... к этому:

AND s.GroupID IN (
0
SELECT GroupId 
FROM student 
GROUP BY GroupId 
HAVING count(*)> (
    SELECT count(*) 
    FROM scrumreview r, student s 
    WHERE r.reviewee = s.studentID 
    AND r.week = 5 
    ) 

Возвращает более чем 1 ряд, либо вам нужно уточнить этот SQL так, чтобы он возвращал только одну строку, либо вам необходимо изменить следующую строку:

AND s.GroupID = (

К IN:

AND s.GroupID IN (
0

Попробуйте вместо этого:

SELECT groupName, 
g.groupId FROM `student` s, 
`group` g WHERE s.GroupId = g.GroupId 
AND s.GroupId IS NOT NULL 
AND s.tutorialId = 2 
GROUP by s.GroupId AND s.GroupID in (SELECT GroupId FROM student GROUP BY GroupId 
HAVING count(*)> (SELECT count(*) FROM scrumreview r, student s WHERE r.reviewee = 
s.studentID AND r.week = 5)) 
Смежные вопросы