2011-05-11 4 views

Répondre

8
SELECT course_id 
FROM T 
WHERE term_id=1 
INTERSECT 
SELECT course_id 
FROM T 
WHERE term_id=2 

Ou

SELECT course_id 
FROM T 
WHERE term_id IN (1,2) 
GROUP BY course_id 
HAVING COUNT(DISTINCT term_id) = 2 
+0

Incroyable. J'ai dû utiliser l'intersection car je voulais aussi quelques autres champs. Maintenant ... puis-je encore joindre le résultat de cette intersection sur une autre table? – speg

+1

Oui. Vous pouvez simplement placer la requête dans un CTE. WITH Q AS () SELECT * FROM requête JOIN othertable ON ... '. Vous devez être conscient que 'INTERSECT' va comparer toutes les colonnes de la liste de sélection pour l'égalité. par exemple. 'SELECT 1,2 INTERSECT SELECT 1,3' retournera zéro ligne. Est-ce l'effet que vous voulez? –

+0

Oui. Les éléments entrecroisés devraient avoir les mêmes valeurs, sauf pour le terme bien sûr. – speg

1
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) 
1

Les réponses de Martin sont concis et intelligent, mais je vais jeter dans deux autres approches qui peuvent être plus faciles à analyser, en fonction de ce que vous êtes habitué à la lecture bien sûr.

Sans faire aucune hypothèse sur votre schéma:

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) 

Si, comme je l'attends, {course_id, term_id} est unique, vous pouvez aussi le faire:

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

Le cas le plus général , pour obtenir tous les cours en plusieurs termes:

select course_id 
from foo 
group by course_id 
having count(term_id) > 1 
Questions connexes