更改重复行的值

时间:2019-01-08 07:21:57

标签: sql sql-server tsql

有一个包含两列(IDData)的表,并且有3行具有相同的值。

ID          Data
4           192.168.0.22 
4           192.168.0.22 
4           192.168.0.22 

现在,我想更改第三行DATA列。在更新SQL Server中,产生一个我无法更改该值的错误。

我可以删除所有3行。但是我不能单独删除third行。

该表适用于我购买的软件,并且我更改了third Server IP

3 个答案:

答案 0 :(得分:3)

您可以尝试以下查询

create table #tblSimilarValues(id int, ipaddress varchar(20))
insert into #tblSimilarValues values (4, '192.168.0.22'),
(4, '192.168.0.22'),(4, '192.168.0.22')

如果要更改所有行,请使用下面的查询

with oldData as (
      select *,
             count(*) over (partition by id, ipaddress) as cnt
      from #tblSimilarValues
     )
update oldData
    set ipaddress = '192.168.0.22_1'
    where cnt > 1;
select * from #tblSimilarValues

如果要跳过第一行,请使用以下查询

;with oldData as (
      select *,
             ROW_NUMBER () over (partition by id, ipaddress order by id, ipaddress) as cnt
      from #tblSimilarValues
     )
update oldData
    set ipaddress = '192.168.0.22_2'
    where cnt > 1;

select * from #tblSimilarValues
drop table #tblSimilarValues

您可以找到实时演示live demo here

答案 1 :(得分:2)

由于没有可让我们将这些行彼此区分的列,因此不存在“第三行”(也没有第一行或第二行)。

我们可以使用ROW_NUMBER函数将任意行号应用于这些行,但是,如果将其放在CTE中,则可以应用DELETE / { {1}}通过CTE进行操作并使用任意行号:

UPDATE

这将产生两行输出-删除了一行。

请注意,我说declare @t table (ID int not null, Data varchar(15)) insert into @t(ID,Data) values (4,'192.168.0.22'), (4,'192.168.0.22'), (4,'192.168.0.22') ;With ArbitraryAssignments as ( select *,ROW_NUMBER() OVER (PARTITION BY ID, Data ORDER BY Data) as rn from @t ) delete from ArbitraryAssignments where rn > 2 select * from @t 是任意的。 ROW_NUMBERPARTITION BY子句中的一个表达式是相同的。因此,根据定义,我们知道没有由此定义任何实际的ORDER BY(因为根据定义,同一分区内的所有行对该表达式具有相同的值)。

答案 2 :(得分:1)

在这种情况下,ID列允许重复的值 错误 ID 应该是唯一的。
现在,您可以做的是创建一个新列,使uniquePrimary Key更改ID的重复值列并将其{{ 1}}。
现在,按照您的Unique/Primary key,您可以通过查询更新 DATA 列值,如下所示:

Unique key/Primary key