#sql #date #ms-access #max
#sql #Дата #ms-access #максимальная
Вопрос:
Рассмотрим две таблицы. В рабочей таблице есть такие поля, как W_ID, W_Name
. Таблица курсов содержит такие поля, как C_ID, C_Name, C_Date
.
Работник может пройти много курсов, и курс может быть пройден многими работниками. Следовательно, между двумя таблицами существует связь «многие ко многим». Разделите многие на многие и создайте новую таблицу с именем 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
Комментарии:
1. Вам нужна только дата прохождения курса las?, а не идентификатор курса?
Ответ №1:
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
Комментарии:
1. Вы можете использовать внутреннее соединение между Takes (Worker_Course) и Course; вам нужно внешнее соединение между Worker и Takes.
2. @Jonathan: для этого требуется поддержка
SELECT t1 LEFT JOIN (t2 JOIN t3)
. Не всеRDBMS
поддерживают это.3. @Jonathan: однако это можно переписать как
RIGHT JOIN
, так что спасибо за хорошее замечание.
Ответ №2:
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;
Комментарии:
1. Оператору требуется дата последнего пройденного курса, таким образом, он получает список всех курсов, пройденных работником.
2. Это не предоставляет строки для работников, которые не посещали никаких курсов.