2011-05-11 23 views
3

我有一個表:SQL語句來捕獲類似的行具有不同ID的

term_id course_id 

1   592 
1   603 
2   592 
2   603 
2   700 

如何創建一個查詢,選擇全部course_ids是足月1和2?

+0

這是什麼關係型數據庫? – 2011-05-11 14:38:10

+0

SQL Server 2005 – speg 2011-05-11 14:41:07

回答

8
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 
+0

令人驚歎。我不得不使用交叉點,因爲我也想要其他幾個字段。現在......我還可以在另一張桌子上加入這個交叉點的結果嗎? – speg 2011-05-11 14:54:27

+1

是的。您可以將查詢放入CTE中。 '; WITH Q AS()SELECT * FROM query JOIN othertable ON ...'。你應該知道'INTERSECT'將比較選擇列表中所有列的相等性。例如SELECT 1,2 INTERSECT SELECT 1,3'將返回零行。這是你想要的效果嗎? – 2011-05-11 14:58:13

+0

是的。相交的項目應具有相同的值,當然除外。 – speg 2011-05-11 15:08:41

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

馬丁的回答簡潔而巧妙的,但我會在兩個方法拋出這可能是更容易解析,這取決於你用什麼樣的閱讀當然。

沒有讓你的架構進行任何假設:

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

更一般的情況下, ,以獲得多個學期的所有課程:

​​
相關問題