使用其他两个表的两个字段的最大值更新一个表的字段值

6rqinv9w  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(339)

我有一些数据表与下面的模式

DeviceStatuses Table
id, Last_Comm, Device_Id
00001, 2020-10-23, DEV1
00002, 2020-09-23, DEV2

RcptStatuses Table
id, Last_Comm, Source
R0001, 2020-10-25, DEV1
R0002, 2020-09-25, DEV2
R0003, 2020-10-30, DEV1

ReceivedTrans Table
id, Last_Comm, Source
R0001, 2020-10-25, DEV1
R0002, 2020-09-25, DEV2
R0003, 2020-10-31, DEV1

我需要用“rcptstatuses表的last\u comm”字段值和“receivedtrans表的last\u comm”字段值中的最大值(max)来更新“devicestatuses”表的“last\u comm”字段值。由于一些限制,我不得不使用一个查询来完成这项工作。
这些是预期的产出

DeviceStatuses Table (After update)
id, Last_Comm, Device_Id
00001, 2020-10-31, DEV1 (max value for DEV1 Last_Comm from RcptStatus and RecievedTx Table)
00002, 2020-09-25, DEV2 (max value for DEV2 Last_Comm from RcptStatus and RecievedTx Table)

我试过这个

UPDATE DeviceStatuses SET Last_Comm = 
(SELECT MAX(lst) FROM (SELECT rsns.Last_Commu AS lst FROM RcptStatuses rsns , DeviceStatuses WHERE Device_Id = rsns.Source 
UNION ALL 
SELECT rtns.Last_Comm AS lst FROM ReceivedTrans rtns, DeviceStatuses WHERE Device_Id = rtns.Source ) As T) 
WHERE 
(SELECT MAX(lst) FROM (SELECT rsns.Last_Comm AS lst FROM RcptStatuses rsns, DeviceStatuses WHERE Device_Id = rsns.Source 
UNION ALL 
SELECT rtns.Last_Comm AS lst FROM ReceivedTrans rtns , DeviceStatuses WHERE Device_Id = rtns.Source ) AS T ) > Last_Comm

但这会导致对所有设备更新相同的时间(设备001的lastcom)。
其他事情consider:-
deviceid和源不唯一(可能在表中重复)
只有当devicestatuses表的deviceid值小于其他表的最大值或deviceid字段值为空时,才需要更新deviceid
数据库驱动程序是mysql
你知道怎么做吗?

sauutmhj

sauutmhj1#

不清楚要更新的列(last\u comm或device\u id)如果要更新对应设备\u id的last\u comm,可以尝试使用基于join的更新来获得最大结果

UPDATE DeviceStatuses d
INNER JOIN  (
    select source, max(Last_Comm ) max_last_comm
    from (
    select source, Last_Comm
    from  RcptStatuses
    UNION 
    select source, Last_Comm
    from  ReceivedTrans
    ) t
    group by source 
) t2 ON d.Device_Id = t2.source
SET d.Last_Comm =  t2.max_last_comm
qmb5sa22

qmb5sa222#

你不需要得到 MAX(Last_Comm) 从其他table。只需连接到其他表中的每一行,并将 Last_Comm 他们中最有价值的。它会一行一行地做,但到最后 DeviceStatuses.Last_Comm 会有最大的价值。

UPDATE DeviceStatuses AS d
JOIN RcptStatuses AS rs ON d.Device_ID = rs.Source
JOIN ReceivedTrans AS rt ON d.Device_ID = rt.Source
SET d.Last_Comm = GREATEST(d.Last_Comm, rs.Last_Comm, rt.Last_Comm)

但如果 DeviceStatuses.Device_ID 为空,我不知道您希望如何将其与其他表中的任何行匹配。

相关问题