我正在尝试在触发器内使用更新查询,以将带有最新ID
的服务记录的Scheduled_Wk
和date
放入其中父Job记录,无论这些位置如何。 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
依此类推:
+----+------------+----------------+--------------+
| 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