Arhn - архитектура программирования

SQL — обновление записей на основе самой последней даты

У меня возникли трудности с обновлением записей в базе данных на основе самой последней даты, и я ищу некоторые рекомендации. Кстати, я новичок в SQL.

В качестве фона у меня есть приложение Windows Forms с SQL Express, и я использую ADO.NET для взаимодействия с базой данных. Приложение предназначено для того, чтобы пользователь мог отслеживать посещаемость сотрудниками различных курсов, которые необходимо посещать на периодической основе (например, каждые 6 месяцев, каждый год и т. д.). Например, они могут извлечь данные, чтобы увидеть, когда сотрудники в последний раз посещали данный курс, а также обновить даты посещения, если сотрудник недавно прошел курс.

У меня есть три таблицы данных:

  1. EmployeeDetailsTable — простой список имен сотрудников, адресов электронной почты и т. д., каждый из которых имеет уникальный идентификатор.
  2. CourseDetailsTable — простой список курсов, каждый из которых имеет уникальный идентификатор (например, 1, 2, 3 и т. д.)
  3. AttendanceRecordsTable – содержит 3 столбца {EmployeeID, CourseID, AttendanceDate, Comments}

Для любого заданного курса у сотрудника будет история посещаемости, т. Е. Если курс необходимо посещать каждый год, у него будет одна запись за столько лет, сколько он проработал в компании.

Что я хочу сделать, так это обновить поле «Комментарии» для данного сотрудника и данного курса на основе самой последней даты посещения. Каков «правильный» синтаксис SQL для этого?

Я пробовал много вещей (например, ниже), но не могу заставить его работать:

UPDATE AttendanceRecordsTable
SET Comments = @Comments
WHERE AttendanceRecordsTable.EmployeeID = (SELECT EmployeeDetailsTable.EmployeeID FROM EmployeeDetailsTable WHERE (EmployeeDetailsTable.LastName =@ParameterLastName AND EmployeeDetailsTable.FirstName =@ParameterFirstName)
AND AttendanceRecordsTable.CourseID = (SELECT CourseDetailsTable.CourseID FROM CourseDetailsTable WHERE CourseDetailsTable.CourseName =@CourseName))
GROUP BY MAX(AttendanceRecordsTable.LastDate)

После долгих поисков я обнаружил, что MAX — это агрегатная функция, поэтому мне нужно использовать GROUP BY. Я также пытался использовать ключевое слово HAVING, но безуспешно.

Может ли кто-нибудь указать мне в правильном направлении? Каков «обычный» синтаксис для обновления записи базы данных на основе самой последней даты?

12.09.2009

Ответы:


1

Итак, вы хотите обновить AttendantsRecordsTable и установить комментарий к самому последнему комментарию CourseDetailsTable для каждого сотрудника?

UPDATE 
  dbo.AttendanceRecordsTable
SET 
  Comments = @Comments
FROM
  CourseDetailsTable cd 
INNER JOIN
  Employee e ON e.EmployeeID = AttendanceRecordTable.EmployeeID
WHERE 
  e.LastName = @LastName 
  AND e.FirstName = @FirstName
  AND cd.CourseName = @CourseName
  AND AttendanceRecordsTable.CourseID = cd.CourseID
  AND AttendanceRecordsTable.LastDate = 
        (SELECT MAX(LastDate) 
           FROM AttendanceRecordsTable a
          WHERE a.EmployeeID = e.EmployeeID 
            AND a.CourseID = cd.CourseID)

Я думаю, что-то вроде этого должно работать.

В основном вам нужно выполнить соединение между таблицей AttendanceRecordTable, которую вы хотите обновить, и таблицами Employee и CourseDetailsTable. Для этих двух вы определили определенные параметры для выбора одной строки, а затем вам нужно убедиться, что вы обновляете только ту последнюю запись AttendanceRecordTable, что вы делаете, убедившись, что это MAX (LastDate) таблицы.

Подвыбор здесь:

(SELECT MAX(LastDate) 
   FROM AttendanceRecordsTable a
  WHERE a.EmployeeID = e.EmployeeID AND a.CourseID = cd.CourseID)

выберет МАКСИМАЛЬНОЕ (последнее) из LastDate записей в AttendanceRecordsTable на основе выбора данного сотрудника (e.EmployeeID) и заданного курса (cd.CourseID).

Соедините это с selects, чтобы выбрать одного сотрудника по имени и фамилии (это, конечно, работает, только если у вас никогда не было двух John Miller в таблице сотрудников!). Вы также выбираете курс с помощью имени курса, так что оно тоже должно быть уникальным, иначе вы получите несколько совпадений в таблице курсов.

Марк

12.09.2009
  • date = (выберите max(date) из таблицы z, где z.FK=FK) всегда является хорошим решением 12.09.2009
  • Марк - Спасибо за пост. Позвольте мне сделать это и вернуться с результатом ... 12.09.2009
  • @Marc - Как мне принять ответ? Я пытался, но не вижу, как я это делаю, поэтому я добавил комментарии. Кстати, у меня еще не настроен OpenID. Может поэтому? 12.09.2009
  • Ну вот !! Спасибо - люди здесь понравятся вам намного больше, если вы продолжите принимать лучшие ответы на свои вопросы :-) 12.09.2009
  • Мне нужно было понять, как заставить его работать с тем, что я делал, но я не смог бы прийти к своему решению без этого поста! благодарю вас 22.02.2013

  • 2

    Предполагая, что ваш первичный ключ на AttendanceRecordsTable равен id:

    UPDATE AttendanceRecordsTable SET Comments = @Comments
    WHERE AttendanceRecordsTable.id = (
        SELECT AttendanceRecordsTable.id
            FROM EmployeeDetailsTable 
            JOIN AttendanceRecordsTable ON AttendanceRecordsTable.EmployeeID = EmployeeDetailsTable.EmployeeID·
            JOIN CourseDetailsTable ON AttendanceRecordsTable.CourseID = CourseDetailsTable.CourseID
        WHERE
            EmployeeDetailsTable.LastName =@ParameterLastName AND EmployeeDetailsTable.FirstName =@ParameterFirstName AND
            CourseDetailsTable.CourseName =@CourseName
        ORDER BY AttendanceRecordsTable.LastDate DESC LIMIT 1)
    

    По сути, этот дополнительный выбор сначала соединит таблицы посещаемости, сотрудников и сведений о курсе, извлечет те строки, в которых имя сотрудника и сведения о курсе соответствуют тем, которые заданы вашими параметрами, и ограничит вывод в обратном порядке одной строкой. Возможно, вы захотите сначала протестировать этот оператор подвыборки.

    Изменить: я только что снова прочитал ваше сообщение, у вас нет ни одного столбца первичного ключа в AttendanceRecordsTable. облом.

    12.09.2009
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..