Sql 如果ID相同,如何更新同一表中的行?

Sql 如果ID相同,如何更新同一表中的行?,sql,sql-server,insert-update,Sql,Sql Server,Insert Update,我有一个数据库,我从这家公司的屏幕抓取创建的。但是,由于公司改变了数据显示方式,我也想更新我的数据库。下面是我想做的一个例子:A:Name,B:ID A B Apple 0020 McIntosh Apple 0020 Ambrosia Apple 0021 Cortland Apple 0022 Apple

我有一个数据库,我从这家公司的屏幕抓取创建的。但是,由于公司改变了数据显示方式,我也想更新我的数据库。下面是我想做的一个例子:A:Name,B:ID

A                            B 
Apple                        0020
McIntosh Apple               0020
Ambrosia Apple               0021
Cortland Apple               0022
Apple                        0022
从上表可以看出,第一行只有名称Apple和键0020,但第二行有不同的名称,但键相同。同样,第四行和第五行也有类似的问题。我需要做的是检查每一行,如果ID相同,则将长度较长的名称复制到较短的名称,以便每个ID的名称相同。但我不知道该怎么做。我正在使用SQLServer2008。你能帮忙吗?我也在尝试使用SSIS来实现这一点,我仍然在玩这个。因为我对SQL查询不是很有经验,所以我在编写查询的逻辑方面遇到了麻烦


谢谢

一个简单的自连接和A列的长度可以帮助我们。一旦我们得到该查询,我们将使用该查询执行update语句。假设您的表的名称是垃圾邮件

如果有一个C列,它包含a中每一行较长的名称,这不是很好也很容易吗?在这种情况下,我们可以简单地发出一个语句UPDATE BUNK 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
现在,让我们尝试将此查询的结果加入我们的垃圾表并创建 a列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
要验证此查询是否有效,请运行第一个查询。如果您得到零行,它就工作了


如果愿意,您可以删除或保留重复的行。

这样您就不会最终发现重复的行了?比如Mcin苹果0020,Mcin苹果0020等等?老实说,我甚至不知道从哪里开始。你能给我一些想法吗?我一直在考虑更新表集合A=从表中选择maxlengthA。但我不明白的是如何检查B值并更新itI,但现在我对复制没问题。因为我将使用SSI拆分表,为每列创建多个表。apple表只是一个例子。我在前面的评论中犯了一个错误:我的意思是:更新表集a=从表中选择a,其中lengthA=从表中选择maxlengthA老实说,最好的做法是确保您具有唯一的标识键。如果第二列必须具有重复项,请添加名为RecordId的第三列,并将其用作真正的唯一ID。