有一个包含两列(ID
,Data
)的表,并且有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
。
答案 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_NUMBER
和PARTITION BY
子句中的一个表达式是相同的。因此,根据定义,我们知道没有由此定义任何实际的ORDER BY
(因为根据定义,同一分区内的所有行对该表达式具有相同的值)。
答案 2 :(得分:1)
在这种情况下,ID列允许重复的值 错误 , ID 应该是唯一的。
现在,您可以做的是创建一个新列,使unique
或Primary Key
或更改ID的重复值列并将其{{ 1}}。
现在,按照您的Unique/Primary key
,您可以通过查询更新 DATA 列值,如下所示:
Unique key/Primary key