Sql 将列复制到具有重复值的另一行
我有一张像这样的桌子Sql 将列复制到具有重复值的另一行,sql,sql-server,Sql,Sql Server,我有一张像这样的桌子 ID Name Country Published 1 Madrid 0 2 Madrid Spain 1 3 Paris France 0 4 London England 0 在名称相同的任何情况下,我都需要将国家/地区从Published=1条目复制到Published=0条目。我一直是这样用手做的: UPDATE mytable SET Country=(SELECT Country FR
ID Name Country Published
1 Madrid 0
2 Madrid Spain 1
3 Paris France 0
4 London England 0
在名称相同的任何情况下,我都需要将国家/地区从Published=1条目复制到Published=0条目。我一直是这样用手做的:
UPDATE mytable SET Country=(SELECT Country FROM mytable WHERE ID = 2) WHERE ID=1
但是有没有什么方法可以自动完成这项工作,而不是手工完成每一项工作?使用join完成这项工作:
DECLARE @t TABLE
(
ID INT ,
Name VARCHAR(20) ,
Country VARCHAR(20) ,
Published BIT
)
INSERT INTO @t
VALUES ( 1, 'Madrid', NULL, 0 ),
( 2, 'Madrid', 'Spain', 1 ),
( 3, 'Paris', 'France', 0 ),
( 4, 'London', 'England', 0 )
UPDATE t1 SET Country = t2.Country
FROM @t t1
JOIN @t t2 ON t1.Name = t2.Name AND t2.Published = 1
WHERE t1.Country IS NULL AND t1.Published = 0
SELECT * FROM @t
输出:
ID Name Country Published
1 Madrid Spain 0
2 Madrid Spain 1
3 Paris France 0
4 London England 0
试试下面的代码。希望对你有帮助
update t1
set t1.country = t2.country
from table t1
inner join table t2
on t1.Name = t2.Name and t2.published = 1
where t1.published = 0
在查询中,您只需更改
ID
引用,以匹配基于Name
的相关子查询,并为Published
和Country
添加过滤器
UPDATE t
SET Country = (SELECT TOP 1 Country FROM t t2 WHERE t2.Name = t.Name AND Published = 1 ORDER BY Country)
WHERE Published = 0
AND Country IS NULL;
UPDATE t
SET Country = (SELECT TOP 1 Country FROM t t2 WHERE t2.Name = t.Name AND Published = 1 ORDER BY Country)
WHERE Published = 0
AND Country IS NULL;