按列合并两个表

时间:2011-09-29 19:24:10

标签: sql sql-server sql-server-2008-r2

应该很简单: 我有两张桌子:

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

3 个答案:

答案 0 :(得分: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以同样的方式工作呢?

答案 1 :(得分:1)

有点令人困惑,因为看起来你需要在名字上匹配,而不是Id?假设情况如此:

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

答案 2 :(得分:0)

将这些映射到表格的唯一方法是name,因此您需要稍微调整一下UPDATE

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