Оператор SQL для захвата похожих строк с разными идентификаторами - PullRequest
3 голосов
/ 11 мая 2011

У меня есть таблица с:

term_id    course_id

1          592
1          603
2          592
2          603
2          700

Как я могу создать запрос для выбора ВСЕХ course_ids, имеющих термин 1 И 2?

Ответы [ 4 ]

8 голосов
/ 11 мая 2011
SELECT course_id
FROM T 
WHERE term_id=1
INTERSECT
SELECT course_id
FROM T 
WHERE term_id=2

Или

SELECT course_id
FROM T 
WHERE term_id IN (1,2)
GROUP BY course_id
HAVING COUNT(DISTINCT term_id) = 2
1 голос
/ 11 мая 2011

В более общем случае, чтобы получить все курсы в несколько терминов:

select course_id
from foo
group by course_id
having count(term_id) > 1
1 голос
/ 11 мая 2011

Ответы Мартина лаконичны и умны, но я добавлю еще два подхода, которые, возможно, будет легче проанализировать, в зависимости от того, что вы, конечно, привыкли читать.

Не делая никаких предположений о вашей схеме:

SELECT DISTINCT
  course_id
FROM
  MyTable AS T1
WHERE
      term_id = 1
  AND EXISTS (SELECT * FROM MyTable AS T2 WHERE T1.course_Id = T2.course_id AND T2.term_id = 2)

Если, как я ожидаю, {course_id, term_id} уникален, вы также можете сделать это:

SELECT
  T1.course_id
FROM
  MyTable AS T1
  INNER JOIN MyTable AS T2 ON T1.course_id = T2.course_id
WHERE
      T1.term_id = 1
  AND T2.term_id = 2
1 голос
/ 11 мая 2011
SELECT * INTO #TEMP1
FROM T
WHERE TERM_ID = 1

SELECT * INTO #TEMP2
FROM T
WHERE TERM_ID = 2

SELECT DISTINCT COURSE_ID
FROM #TEMP1
WHERE COURSE_ID IN (SELECT DISTINCT COURSE_ID FROM #TEMP2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...