業務講解
alarmeventlog(簡稱ael)表示一條報警信息;
alarmclientlog(簡稱acl)表示操作員對報警的處理記錄,同一報警可能有多條處理記錄。
ael與acl是一對多的關係,通過各自的strIndex和strUniqueTime關聯。
acl.HandleTime表示每個操作員的處理時間。
現需要將acl中對應最新的一條記錄拷貝到ael中去。
代碼實現
因要支持兩種數據庫,且數據庫之間存在語法限制,因此需要分別實現。
mysql的實現
UPDATE alarmeventlog ael SET ael.nState = IFNULL(
(SELECT
acl.nState
FROM alarmclientlog acl
WHERE ael.strIndex = acl.strIndex
AND ael.strUniqueTime = acl.strUniqueTime
GROUP BY acl.strIndex
ORDER BY acl.HandleTime), ael.nState
);
語句講解:
IFNULL(符合條件的結果,不符合條件的結果)
找到最新的一條記錄:
GROUP BY acl.strIndex -- 對應多條記錄,分組以後可以拿到一條記錄
ORDER BY acl.HandleTime -- 找到多條記錄中時間最新的一條,在GROUP時將被選中
sqlserver的實現
UPDATE alarmeventlog SET alarmeventlog.nState = ISNULL(
(
SELECT
alarmclientlog.nState
FROM alarmclientlog
WHERE alarmeventlog.strIndex = alarmclientlog.strIndex
AND alarmeventlog.strUniqueTime = alarmclientlog.strUniqueTime
), alarmeventlog.nState
);
語句講解:
ISNULL(符合條件的結果,不符合條件的結果)
注意:由於sqlserver語法限制,不能在子語句中使用GROUP BY和ORDER BY,因此ael中的結果將是acl中任意一條,而不是最新一條。