2013-09-30 90 views
20

我有一个表,看起来是这样的:SQL服务器 - 从数据在同一个表更新列

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

我想更新的2013条记录与其中SETID等于2012

保费值

所以查询后,应该是这样的:

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

任何帮助,不胜感激

+0

'2013 records' - 请澄清这一部分。这是否存储在你的数据库的某个地方?或者它只是'SetId'列的另一种解释? – Nogard

+0

@dawsonz:如果“2012年保费的第一笔记录是'N'”,您的预期产出是多少? –

+0

我想将那些ID与2012年的记录相同的Premium列复制到2013年的那些记录中。 – dawsonz

回答

29

目前还不清楚这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 
+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

7

我认为这是正确的解决办法:

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 
+1

非常好的一点Chris我刚刚测试并意识到这一点,谢谢。 – dawsonz

+0

糟糕,删除了评论。这是你应该注意到这个答案和我自己的细微差别,如果没有与'SetId = 2012'匹配的条目和相同的'ID',那么它会尝试将't.Premium'更新为' NULL“,这可能会失败,具体取决于表模式以及该列是否允许空值。 –

2

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

update TABLE_A 
    set TABLE_A.Col1=B.Col2 
    from TABLE_A B 
相关问题