2011-04-28 39 views
2

考慮兩個表。工人表的字段類似W_ID, W_Name。課程表有C_ID, C_Name, C_Date等字段。MAX每個工人的日期

工人可以採取許多課程,許多工人可以採取課程。因此,這兩個表格之間存在多對多的關係。打破多對多,並創建一個名爲Takes的表,它由外鍵W_ID和C_ID組成。

這裏是一個問題:我想找出所有工作人員的列表以及他們最後採取的方法。例如,如果W_ID = 1,則C_Date 20/01/2010和C_Date 25/10/2010和C_Date 20/12/2010。

然後需要的結果是:

W_ID  C_Date 
1  20/12/2010 
2 
3 
4 

編輯

我想要找的過程中每個工人做工人會做很多課程的最大日期。我是一名商科學生,所以我不能使用INNER JOIN命令。 IN可以用來代替?

我用我的SQL在Microsoft Access

+0

哪'RDBMS'您使用的? – Quassnoi 2011-04-28 14:20:10

+0

你想只是拉斯維加斯的日期嗎?,而不是課程ID? – Lamak 2011-04-28 14:21:05

回答

3
SELECT w.w_id, MAX(c.c_date) 
FROM worker w 
LEFT JOIN 
     worker_course wc 
ON  wc.w_id = w.w_id 
LEFT JOIN 
     course с 
ON  c.c_id = wc.c_id 
GROUP BY 
     w.w_id 

或本:

SELECT w.w_id, MAX(c.c_date) 
FROM course с 
JOIN worker_course wc 
ON  wc.c_id = c.c_id 
RIGHT JOIN 
     worker w 
ON  w.w_id = wc.w_id 
GROUP BY 
     w.w_id 
+0

您可以使用Takes(Worker_Course)和Course之間的內部連接;你需要Worker和Takes之間的外連接。 – 2011-04-28 14:24:56

+1

@Jonathan:這需要支持'SELECT t1 LEFT JOIN(t2 JOIN t3)'。並非所有的'RDBMS'都支持這一點。 – Quassnoi 2011-04-28 14:26:32

+0

@Jonathan:但是,它可以改寫爲'RIGHT JOIN',所以謝謝你的一個好點。 – Quassnoi 2011-04-28 14:34:54

0
select W_ID,C_ID,max(C_Date) 
from(select W_ID,C_ID,C_Date 
    from worker 
    join takes using (W_ID) 
    join course using (C_ID) 
)wc 
group by W_ID,C_ID; 
+0

op想要獲得最後一次課程的日期,這樣他就可以獲得工作人員所有課程的列表。 – Lamak 2011-04-28 14:27:22

+0

這不會爲沒有參加任何課程的工作人員提供行。 – 2011-04-28 14:43:21