结合由列两个表

应该是很简单:我有两个表:

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

--------------解决方案-------------

那种混乱,因为它似乎你需要匹配的名字,并没有标识? 假定是这种情况:

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

因为这是一个相当基本的和经常看到的问题,我想你是新来的SQL Server产品从其2008 R2版本的影响。

我鼓励你不寻求使用专有编写新的代码UPDATE..FROM语法,可以说是既保留在产品中保持与旧代码兼容。

还要注意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的工作方式相同?

这些映射到表的唯一方法就是name ,所以你需要调整您UPDATE一点点:

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

分类:SQL 时间:2015-03-14 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.737 (s). 10 q(s)