Используйте несколько полей из совокупных записей для запроса на обновление - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь использовать запрос обновления внутри триггера, чтобы поместить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...