簡體   English   中英

更改重復行的值

[英]Change value of duplicated rows

有一個包含兩個列( 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

您可以嘗試以下查詢

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 BYORDER BY子句中的表達式之一是相同的。 因此,根據定義,我們知道沒有由此定義真正的ORDER (因為根據定義,同一分區內的所有行對該表達式具有相同的值)。

在這種情況下,ID列允許重復值錯誤ID應該是唯一的。
現在,您可以做的是創建一個新列,使該Primary Key成為unique Primary KeyPrimary 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM