Оператор SQL, один и тот же столбец, разные данные - PullRequest
0 голосов
/ 03 сентября 2010

У меня есть стол со студентами 4 курсов и двух разных факультетов (Math 101, Math 102, английский 201, английский 202). Я хочу выбрать учеников по математике 101 и по английскому 201, если у них есть, и по английскому 202, если у них есть, или по обоим, если у них были оба.


Изменить:
StudentID | Dept | CrsNum
 12345      MS     101
 99999      MS     102
 10000      EH     201
 56789      EH     201
 12345      EH     201
 12345      EH     202

В идеале, результат запроса должен показывать ученика 12345 со всеми курсами, в которых он учился, поскольку он единственный, кто прошел и MS 101, и оба курса EH.

Ответы [ 3 ]

1 голос
/ 03 сентября 2010

Простой подзапрос будет делать:

select StudentID from table where 
(Dept = "MS" and CrsNum = 101) and 
StudentID in ( select StudentID from table where
             ( (Dept = "EH" and CrsNum = 201) or
               (Dept = "EH" and CrsNum = 202) ) )
1 голос
/ 03 сентября 2010

Попробуйте что-то вроде:

select StudentID, Dept, CrsNum
from StudentCourse SC
where CrsNum in (101, 201, 202) and
exists 
(select null
 from StudentCourse SC1
 where SC.StudentID = SC1.StudentID and
       sc1.CrsNum = 101) and
exists 
(select null
 from StudentCourse SC2
 where SC.StudentID = SC2.StudentID and
       sc1.CrsNum in (201,202))

Кроме того, вы можете сделать это без каких-либо подзапросов с запросом, подобным:

select StudentID, 
       Sum(case when CrsNum = 101 then 1 else 0) InCrs101,
       Sum(case when CrsNum = 201 then 1 else 0) InCrs201,
       Sum(case when CrsNum = 202 then 1 else 0) InCrs202
from StudentCourse SC
where CrsNum in (101, 201, 202)
group by StudentID
having Sum(case when CrsNum = 101 then 1 else 0) >= 1 and
       (Sum(case when CrsNum = 201 then 1 else 0) >= 1 or
        Sum(case when CrsNum = 202 then 1 else 0) >= 1)
1 голос
/ 03 сентября 2010
SELECT S1.StudentID
  FROM Students AS S1 JOIN (SELECT S3.StudentID
                              FROM Students AS S3
                             WHERE S3.Dept = 'MS'
                               AND S3.CrsNum = 101) AS S2
       ON S1.StudentID = S2.StudentID
 WHERE S1.Dept = 'EH'
   AND S1.CrsNum IN (201, 202);

Или, если требуется вся информация (как предлагается в комментарии), используйте ее как подзапрос, который выбирает соответствующие идентификаторы учащихся):

SELECT * FROM Students
 WHERE StudentID IN
            (SELECT S1.StudentID
               FROM Students AS S1 JOIN (SELECT S3.StudentID
                                           FROM Students AS S3
                                          WHERE S3.Dept = 'MS'
                                            AND S3.CrsNum = 101) AS S2
                    ON S1.StudentID = S2.StudentID
              WHERE S1.Dept = 'EH'
                AND S1.CrsNum IN (201, 202));
...