2011-09-29 73 views
0

應該很容易: 我有兩個表:柱結合兩個表

table 1 

    ID NAME NEWID 
    1 DOG 
    2 CAT 
    3 HORSE 


table 2 

NAME ID 
DOG 100 
CAT 200 
Horse 300 

我需要的結果如下:

ID NAME NEWID 
    1 DOG 100 
    2 CAT 200 
    3 HORSE 300 

我的想法是:

Update table1 
set NewId = (select ID from table2 where Id =NewID) 

它說:無效的列名NewId

+0

列已創建? – gbianchi

回答

1

有點混淆,因爲它似乎你需要匹配的名稱,而不是Id?假如是這樣的話:

UPDATE 
    t1 
SET 
    t1.NEWID = t2.ID 
FROM 
    table1 t1 
    INNER JOIN table2 AS t2 ON t1.NAME = t2.NAME; 
0

將它們映射到表的唯一方法是通過name,所以您需要調整您UPDATE一點點:

UPDATE table1 
    SET NEWID = (
       SELECT ID 
        FROM table2 
       WHERE table2.NAME = table1.NAME 
       ); 
2

因爲這是一個非常基本的和經常遇到的問題,我假設你是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); 

有用於HORSE300400兩個可能的值。挑選哪一個是無證的行爲,並且可能是不可預測的。

我反而鼓勵您使用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以同樣的方式工作?

+0

這是一個非常酷的信息。非常感謝 – user194076