在工作中設計到一些字段值的初始化,特別是生產系統中添加字段時處理歷史數據的初始化,往往需要更新字段值,這里說說將A表中的字段值賦值給B表中的字段的幾種更新方法。
1、通過子查詢實現
UPDATE tableA a SET a.column1 = ( SELECT b.column1 FROM tableB b WHERE a.id = b.aid ), a.column2 = ( SELECT b.column2 FROM tableB b WHERE a.id = b.aid ) WHERE EXISTS ( SELECT 1 FROM BtableB c WHERE a.id = c.aid );
2、通過逗號操作符的內連接
UPDATE tableA a, tableB b SET a.column1 = b.column1, a.column2 = b.column2 WHERE a.id = b.aid;
3、各種內、外連接都可以實現
UPDATE tableA a LEFT JOIN tableB b ON a.id = b.aid SET a.column1 = b.column1, a.column2 = b.column2;
4、SQL允許的各種連接,並根據CASE函數控制不同類型數據更新不同的值
UPDATE system_alarm s LEFT JOIN ( SELECT a.id aid, ( CASE a.alarm_type WHEN '1' THEN d.p1_min WHEN '2' THEN d.p1_max WHEN '5' THEN d.p2_min WHEN '6' THEN d.p2_max ELSE 0 END ) AS num FROM system_alarm a LEFT JOIN device d ON a.device_id=d.device_id ) aaa ON s.id=aaa.aid SET s.threshold=aaa.num;
這里沒有用偽SQL,因為結合實際業務更好理解,大概說一下這條SQL的實際業務邏輯:設備的報警表中添加了新的字段:threshold(閾值),用來保存報警時的閾值,需要根據不同的報警類型把歷史報警的對應閾值放入新字段中,這里統一把當前的設備閾值保存到新字段,因修改過閾值而產生的不合理數據另外進行針對性的處理。