使用汇总记录中的多个字段进行更新查询

时间:2019-05-06 07:04:51

标签: sql-server

我正在尝试在触发器内使用更新查询,以将带有最新ID 的服务记录的Scheduled_Wkdate放入其中父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

0 个答案:

没有答案