35

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

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

非常感谢任何帮助

4

5 回答 5

48

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

使用表变量的完整示例,您可以在 Management Studio 中自行测试。

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 
于 2013-09-30T12:18:22.280 回答
14
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

于 2013-09-30T12:17:16.743 回答
10

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

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 
于 2013-09-30T12:24:48.347 回答
4

我们可以从 self 表中更新表,如下所示:

update TABLE_A 
   set TABLE_A.Col1=B.Col2
  from TABLE_A B 
于 2017-06-02T07:16:02.303 回答
3

绝对没有必要INNER JOIN使用s FROMs aliases从同一张表更新时接受接受的答案建议的所有那些花哨的长度- 请参阅此处的小提琴!

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

等等 - 非常简单!Antoine de Saint-Exupéry 是对的

“La perfect est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer。”</p>


达到完美,不是在没有什么可以添加的时候,而是在没有什么可以带走的时候。

于 2020-03-20T16:48:31.340 回答