因爲這是一個非常基本的和經常遇到的問題,我假設你是SQL Server產品的新手,並且從2008 R2版本開始具有影響力。
我鼓勵您不要試圖使用專有的UPDATE..FROM
語法編寫新代碼,可以說只保留在產品to remain compatible with legacy code中。
另請注意,UPDATE..FROM
語法可能會導致意外和不可預知的行爲。例如如果您的table2
包含HORSE
的第二行,其值不同爲ID
,例如,
CREATE TABLE table1 (ID INTEGER, NAME VARCHAR(10), NEWID INTEGER);
CREATE TABLE table2 (NAME VARCHAR(10), ID INTEGER);
INSERT INTO table1 VALUES (1, 'DOG', NULL),
(2, 'CAT', NULL),
(3, 'HORSE', NULL);
INSERT INTO table2 VALUES ('DOG', 100),
('CAT', 200),
('HORSE', 300),
('HORSE', 400);
有用於HORSE
,300
和400
兩個可能的值。挑選哪一個是無證的行爲,並且可能是不可預測的。
我反而鼓勵您使用MERGE
語法,作爲標準SQL的擴展,例如
MERGE INTO table1
USING table2
ON table1.NAME = table2.NAME
WHEN MATCHED THEN
UPDATE
SET NEWID = table2.ID;
注意,在加入該行的如上所述的MERGE
語法會產生一個錯誤(「MERGE語句試圖更新或刪除同一行不止一次......」),這是比默默地使用任意的和可能不正確的值更令人滿意。想想看,如果SQL Server的設計者今天真的認爲UPDATE..FROM
的行爲是可取的,那麼他們爲什麼不使MERGE
以同樣的方式工作?
列已創建? – gbianchi