应该很简单: 我有两张桌子:
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 :(得分: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);
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
以同样的方式工作呢?
答案 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
);