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

daw*_*onz 25 sql sql-server

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

SetId      ID       Premium
2012        5          Y
2012        6          Y
2013        5          N
2013        6          N
Run Code Online (Sandbox Code Playgroud)

我想用setid等于2012的溢价值更新2013年的记录.

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

SetId      ID       Premium
2012        5          Y
2012        6          Y
2013        5          Y
2013        6          Y
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢

Chr*_*ver 39

目前尚不清楚您想用哪个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 
Run Code Online (Sandbox Code Playgroud)


Tim*_*ter 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 
Run Code Online (Sandbox Code Playgroud)

Demonstration


vel*_*ije 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 
Run Code Online (Sandbox Code Playgroud)


小智 5

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

update TABLE_A 
   set TABLE_A.Col1=B.Col2
  from TABLE_A B 
Run Code Online (Sandbox Code Playgroud)


Vér*_*ace 5

绝对没有必要去使用ss 的公认答案所建议的所有那些花哨的长度,或者从同一张表更新时 - 请参阅此处的小提琴!INNER JOIN FROM aliases

\n\n
CREATE TABLE b (x INT, y INT);\n
Run Code Online (Sandbox Code Playgroud)\n\n

填充:

\n\n
INSERT INTO b (x) VALUES (2), (3), (4);\n
Run Code Online (Sandbox Code Playgroud)\n\n

查看:

\n\n
SELECT * FROM test;\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
x   y\n2   null\n3   null\n4   null\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在——简单地说:

\n\n
UPDATE b SET y = x\nWHERE x <= 3;\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后:

\n\n
SELECT * FROM b;\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
x   y\n2   2\n3   3\n4   null\n
Run Code Online (Sandbox Code Playgroud)\n\n

et voil\xc3\xa0 - 非常简单!Antoine de Saint-Exup\xc3\xa9ry 是对的

\n\n
\n

\xe2\x80\x9cLa 完美 est atteinte,不 pas lorsqu\'il n\'ya plus rien \xc3\xa0\n ajouter,mais lorsqu\'il n\'ya plus rien \xc3\xa0 退休者。\xe2\ x80\x9d

\n
\n\n


\n\n
\n

完美的实现,不是在没有什么可以添加的时候,而是在没有什么可以删除的时候。

\n
\n