SQL Server - 从同一个表中的数据更新列

时间:2013-09-30 12:13:54

标签: sql sql-server

我有一张看起来像这样的表:

SetId      ID       Premium
2012        5          Y
2012        6          Y
2013        5          N
2013        6          N

我希望使用setid等于2012的溢价值更新2013年记录。

所以在查询之后它看起来像这样:

SetId      ID       Premium
2012        5          Y
2012        6          Y
2013        5          Y
2013        6          Y

任何帮助非常感谢

5 个答案:

答案 0 :(得分:37)

目前尚不清楚您想要使用哪个2012年值来更新2013年的价值,我认为ID应该是相同的。

使用表变量的完整示例,您可以在管理工作室中自行测试。

DECLARE @Tbl TABLE (
    SetId INT,
    Id INT, 
    Premium VARCHAR(1)
)

INSERT INTO @Tbl VALUES (2012, 5, 'Y')
INSERT INTO @Tbl VALUES (2012, 6, 'Y')
INSERT INTO @Tbl VALUES (2013, 5, 'N')
INSERT INTO @Tbl VALUES (2013, 6, 'N')

--Before Update
SELECT * FROM @Tbl 

--Something like this is what you need
UPDATE t 
SET t.Premium = t2.Premium 
FROM @Tbl t 
INNER JOIN @Tbl t2 ON t.Id = t2.Id 
WHERE t2.SetId = 2012 AND t.SetId = 2013

--After Update    
SELECT * FROM @Tbl 

答案 1 :(得分:10)

UPDATE t 
SET t.Premium = (SELECT TOP 1 t2.Premium
                 FROM dbo.TableName t2
                 WHERE t2.SetId = 2012)
FROM dbo.TableName t
WHERE t.SetId = 2013 

Demonstration

答案 2 :(得分:9)

我认为这是正确的解决方案:

UPDATE t 
SET t.Premium = (SELECT TOP 1 t2.Premium
                 FROM dbo.TableName t2
                 WHERE t2.SetId = 2012 AND t2.Id = t.ID)
FROM dbo.TableName t
WHERE t.SetId = 2013 

答案 3 :(得分:2)

我们可以从自己的表中更新表格,如下:

update TABLE_A 
   set TABLE_A.Col1=B.Col2
  from TABLE_A B 

答案 4 :(得分:1)

绝对不需要使用INNER JOIN s FROM s aliases(从同一张表更新时),请参见小提琴here

CREATE TABLE b (x INT, y INT);

人口:

INSERT INTO b (x) VALUES (2), (3), (4);

检查:

SELECT * FROM test;

结果:

x   y
2   null
3   null
4   null

现在-简而言之:

UPDATE b SET y = x
WHERE x <= 3;

然后:

SELECT * FROM b;

结果:

x   y
2   2
3   3
4   null

Etvoilà-非常简单! Antoine deSaint-Exupéry是right

“完美无瑕,无故失利à ajouter,mais lorsqu'il n'y加上rienàretirer。”


完美无缺,不是没有其他可添加的东西,而是 当没有东西可以拿走的时候。