如果id相同,如何更新同一个表中的行?

时间:2014-06-12 19:16:04

标签: sql sql-server insert-update

我有一个数据库是我从该公司的屏幕抓取中创建的。但是,由于公司改变了显示数据的方式,我也希望更新我的数据库。这是我想要做的一个例子:(A:姓名,B:ID)

A                            B 
Apple                        0020
McIntosh Apple               0020
Ambrosia Apple               0021
Cortland Apple               0022
Apple                        0022

从上表中可以看出,第一行只有名称" Apple"键和#34; 0020",但第二行具有不同的名称,但具有相同的键。类似地,第四和第五行具有类似的问题。我需要做的是检查每一行,如果id是相同的,那么将长度较长的名称复制到较短的名称,以便每个ID的名称相同。但我不知道该怎么做。我使用的是SQL Server 2008.你能帮忙吗?我也尝试使用SSIS实现这一目标,而我仍然在玩这个。由于我对SQL查询不是很有经验,因此我无法绕过编写查询的逻辑。

谢谢

1 个答案:

答案 0 :(得分:1)

简单的自我联接和A列的长度可以帮助我们。一旦我们得到了查询,我们将使用该查询来执行更新(语句)。假设你的表名是垃圾。

如果有一个C列包含A中每行的较长名称,那么这不是很好吗?在这种情况下,我们可以简单地发出一个语句UPDATE Junk SET A = C.让我们尝试以某种方式实现这一点。让我们先用下面的查询得到“C列” -

select *
from
(
select j1.A as A1,j1.B as B1,j2.A as C1 
from Junk as j1
inner join Junk as j2 --self join
on j1.B = j2.B
and LEN(j1.A) < LEN(j2.A)
) as s1

现在让我们尝试让这个查询的结果“加入”我们的垃圾表并创建 一列C.一旦我们正确地做到了,我们就可以做一个“简单”的更新。在上面 查询,将select *替换为update语句,如下所示 -

update Junk 
set Junk.A = s1.C1
from
(
select j1.A as A1,j1.B as B1,j2.A as C1 
from Junk as j1
inner join Junk as j2
on j1.B = j2.B
and LEN(j1.A) < LEN(j2.A)
) as s1
WHERE Junk.A = s1.A1
and Junk.B = s1.B1

要验证此查询是否有效,请运行第一个查询。如果你获得零行,它就可以工作。

如果您愿意,可以删除重复项或保留它们。