МАКСИМАЛЬНАЯ дата для каждого работника

#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. Это не предоставляет строки для работников, которые не посещали никаких курсов.