[英]Change value of duplicated rows
有一個包含兩個列( 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
。
您可以嘗試以下查詢
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
由於沒有可讓我們將這些行彼此區分開的列,因此就沒有“第三行”(也沒有第一行或第二行)。
我們可以使用ROW_NUMBER
函數將任意行號應用於這些行,但是,如果將其放在CTE中,則可以通過CTE應用DELETE
/ 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
子句中的表達式之一是相同的。 因此,根據定義,我們知道沒有由此定義真正的ORDER
(因為根據定義,同一分區內的所有行對該表達式具有相同的值)。
在這種情況下,ID列允許重復值錯誤 , ID應該是唯一的。
現在,您可以做的是創建一個新列,使該Primary Key
成為unique
Primary Key
或Primary Key
或者更改ID列的重復值,並將其設置為Unique/Primary key
。
現在,按照您的Unique key/Primary key
您可以通過查詢更新DATA列值,如下所示:
UPDATE <Table Name>
SET DATA = 'new data'
WHERE ID = 3;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.