我有一個表table1,我試圖將一列更新completed為基于id. 因為該表以及更新的列和WHERE子句欄位保持不變,所以我一直在研究整合 SQL 陳述句的潛力。
我有一個table1這樣的:
| id | completed |
| -- | --------- |
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | NULL |
| 5 | NULL |
| 6 | NULL |
| 7 | NULL |
| 8 | NULL |
| 9 | NULL |
| 10 | NULL |
| 11 | NULL |
| 12 | NULL |
這是我目前作為標準的一個示例:(它繼續為另外 13 個UPDATE陳述句)
UPDATE table1 SET completed = 25
WHERE id IN (1, 2, 3, 4);
UPDATE table1 SET completed = 27
WHERE id IN (5, 6, 7, 8);
UPDATE table1 SET completed = 28
WHERE id IN (9, 10, 11, 12);
我試過類似的東西:(雖然我知道這是不對的)
UPDATE table1 (
SET completed = 25 WHERE id IN (1, 2, 3, 4),
SET completed = 27 WHERE id IN (5, 6, 7, 8),
SET completed = 28 WHERE id IN (9, 10, 11, 12)
);
假設:id在真實表中是無序的;跳過且與已完成的編號順序無關
表1的預期結果:
| id | completed |
| -- | --------- |
| 1 | 25 |
| 2 | 25 |
| 3 | 25 |
| 4 | 25 |
| 5 | 26 |
| 6 | 26 |
| 7 | 26 |
| 8 | 26 |
| 9 | 27 |
| 10 | 27 |
| 11 | 27 |
| 12 | 27 |
問題:考慮到上述情況,是否會有更統一的版本?還是第一個代碼最有效?
我還查看了 stackoverflow 和檔案,但沒有直接看到類似的問題。
uj5u.com熱心網友回復:
UPDATE table1
SET completed = CASE WHEN id IN (1, 2, 3, 4) THEN 25
WHEN id IN (5, 6, 7, 8) THEN 27
WHEN id IN (9, 10, 11, 12) THEN 28
ELSE completed END
這將更新表中的每一行,即使可能將它們中的大多數設定回原始值。
我也看到了這個:
id 在真實表中是無序的;跳過且與已完成的編號順序無關
鑒于此,您可能希望實際創建一個表(命名為CompletionMap)來跟蹤這些映射。像這樣的東西:
| ID | 地位 |
|---|---|
| 1 | 25 |
| 2 | 25 |
| 3 | 25 |
| 4 | 25 |
| 5 | 27 |
| 6 | 27 |
| 7 | 27 |
| 8 | 27 |
| 9 | 28 |
| 10 | 28 |
| 11 | 28 |
| 12 | 28 |
此時,您甚至不再需要更新原始表,因為您已經在資料庫中擁有這些資料。但如果你真的想要,它看起來像這樣:
UPDATE t1
SET t1.completed = m.status
FROM t1
INNER JOIN CompletionMap m on m.id = t1.ID
如果您不想這樣做,您也可以以類似的方式使用表值建構式:
UPDATE t1
SET t1.completed = map.status
FROM t1
INNER JOIN (VALUES
(1, 25),
(2, 25),
(3, 25),
(4, 25),
(5, 27),
(6, 27),
(7, 27),
(8, 27),
(9, 28),
(10, 28),
(11, 28),
(12, 28)
) as map(id, status) on map.id = t1.ID
這具有更好地定位 UPDATE 以僅影響所需行的額外優勢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/466126.html
