Я пытаюсь использовать запрос обновления внутри триггера, чтобы поместить ID
и Scheduled_Wk
служебной записи с Последним date
в родительскую запись задания, где бы они ни находились не то же самое. Сервис с самым высоким ID
не обязательно является сервисом с самым последним date
, и часто есть несколько сервисов с одинаковым MAX(Scheduled_Wk)
. Меня интересуют только записи, которые не отменяются (Status = 9
). Предполагая, что все они не отменены, вот несколько примеров записей из служебной таблицы:
+----+--------+--------------+--------------+
| ID | JOB_ID | SCHEDULED_WK | DATE |
+----+--------+--------------+--------------+
| 1 | 1 | 1 | '2019-04-01' |
| 2 | 1 | 2 | '2019-04-08' |
| 3 | 1 | 3 | '2019-04-15' |
| 4 | 1 | 4 | '2019-04-29' |
| 5 | 1 | 5 | '2019-04-22' |
| 6 | 2 | 3 | '2019-04-16' |
| 7 | 2 | 4 | '2019-04-22' |
| 8 | 2 | 4 | '2019-04-23' |
| 9 | 2 | 5 | '2019-04-29' |
| 10 | 2 | 5 | '2019-04-30' |
| 11 | 3 | 2 | '2019-04-09' |
| 12 | 3 | 2 | '2019-04-11' |
| 13 | 3 | 2 | '2019-04-16' |
| 14 | 3 | 3 | '2019-04-10' |
| 15 | 3 | 3 | '2019-04-17' |
| 16 | 3 | 3 | '2019-04-18' |
| 17 | 4 | 3 | '2019-04-17' |
| 18 | 4 | 4 | '2019-04-24' |
| 19 | 4 | 5 | '2019-05-01' |
+----+--------+--------------+--------------+
Если я использую MAX(Date)
, MAX(ID)
Я обеспокоен тем, что в некоторых случаях я буду возвращать поля из двух отдельных записей (где запись с самым высоким ID
не является записью с самым последним date
) и это не является намерением: это должна быть ID
записи службы с самой последней date
, независимо от того, какая это. Приведенные выше данные должны UPDATE
Таблица JOB таким образом:
+----+------------+----------------+--------------+
| ID | Service_ID | L_SCHEDULED_WK | (DATE) |
+----+------------+----------------+--------------+
| 1 | 4 | 4 | '2019-04-29' |
| 2 | 10 | 5 | '2019-04-30' |
| 3 | 16 | 3 | '2019-04-18' |
| 4 | 19 | 5 | '2019-05-01' |
+----+------------+----------------+--------------+
Я пытался обойти это, используя TOP 1
, но я не видел, чтобы он использовал это раньше, и меня беспокоит, что я что-то упустил.
Мозг превращается в кашу, это сработает?
;WITH cteCompare AS (
SELECT J.ID,
(SELECT TOP 1 S.ID
FROM Service S
WHERE STATUS <> 9 AND S.JOB_ID = J.ID
ORDER BY Date DESC) ServID,
J.L_SERVICE_ID,
(SELECT TOP 1 S.SCHEDULED_WK
FROM Service S
WHERE STATUS <> 9 AND S.JOB_ID = J.ID
ORDER BY Date DESC) ServWk,
J.L_SCHEDULED_WK
FROM JOB J
WHERE J.STATUS = 'A'
)
UPDATE JOB
SET L_SERVICE_ID = S.ServID, L_SCHEDULED_WK = ServWk
FROM cteCompare S
WHERE (ServID<>L_SERVICE_ID
OR
ServWk<>L_SCHEDULED_WK)
AND
S.ID = JOB.ID