2014-09-13 60 views
0

現在有兩個表學生(sid,姓名)當然(cid,姓名),這種關係是多對多的。因此,還有另一張表student_course(sid,cid),它存儲關於哪些課程由誰選擇的信息。獲取所有學生選擇的課程

如何編寫可以獲得所有學生選擇的課程的sql?

+0

好的沒有問題兄弟,它發生 – Skynet 2014-09-13 15:26:00

回答

2

標準溶液:用NOT EXISTS (... NOT EXISTS (...))結構:

  • 找到所有學生都參加的所有課程部分
  • == >>有不得存在一個學生說在這個過程中

SELECT * FROM course c 
WHERE NOT EXISTS (
     SELECT * from student s 
     WHERE NOT EXISTS (
       SELECT * from student_course cs 
       WHERE cs.sid = s.sid 
       AND cs.cid = c.cid 
       ) 
     ) 
     ; 

該查詢往往更快(給出appropiate指標),比參加count() == count()變體。原因爲此:您不必計數全部的(不同)記錄;一旦你找到了一個學生,做採取當然你也可以省略這個當然嫌疑人的名單。此外:反連接往往可以利用索引[所以可以計數(),但仍然必須計數所有索引中的(不同的)鍵值]

+0

我喜歡我的答案。不過,我更喜歡你的。在同一小提琴中運行時,它也會表現得更好。所以有一個投票 – pinkfloydx33 2014-09-13 17:13:28

1
Select c.cid, c.name 
From course c where 
(select count(1) from student) = (select count(1) from student_course sc where sc.cid = c.cid); 

See SQL Fiddle

它發現,其中在student_course表當然條目的數量的學生人數相匹配的所有課程

CID NAME 
1 Test Course1 
4 Test Course4