按照條件在兩個表之間拷貝數據 for mysql & sqlserver

業務講解

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中任意一條,而不是最新一條。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章