簡體   English   中英

SQL自聯接更新行

[英]SQL Self-JOIN To Update rows

我在SQL Server中有一個包含行的表,其中一些我需要更新,具體取決於同一個表中是否存在其他行。 表和示例數據如下所示:

SQL Server表:

    TABLE tblConnector(
      ID1 [int] NOT NULL,
      ID2 [int] NOT NULL,
      ID3 [int] NOT NULL,
      ...other cols...)

它有一個PRIMARY KEY CLUSTEREDID1, ID2, ID3 ) - 意味着復合鍵必須是唯一的。

樣本數據:

ID1  ID2  ID3
-------------
111  222  1
111  222  9999
333  444  1    <--- update only this row
555  666  1        
555  666  9999
777  888  2
777  888  9999 
123  456  3    <--- don't update this row

我需要更新此表中的任何行,設置ID3 = 9999 ,其中ID3當前為1,表中沒有其他行具有相同的ID1ID2值, ID3 = 9999

在我的示例數據中,我只想更新第3行,設置ID3 = 9999 - 因為它具有ID3 = 1並且表中沒有其他行具有相同的ID1ID2值(其中ID3 <> 1 )。 我不想更新最后一行 - 所以使用count()隔離行不是一種有效的方法。

我想在ID3中的當前值為1時才將ID3列更新為9999 ...並且沒有其他行具有相同的ID1和ID2值,其中ID3 = 9999.ID1,ID2和ID3包含唯一鍵和在ID3中設置9999不能復制已存在的鍵值。

我嘗試過多次嘗試將表連接到自身,但我似乎無法獲得只會影響我想要的行的UPDATE語句。

關於如何編寫這個SQL的任何建議?

這是使用common table expressioncount() over partition的一個選項:

with cte as (
  select *, count(*) over (partition by id1, id2) rn
  from tblConnector
  )
update cte 
set id3 = 9999
where id3 = 1
  and rn = 1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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