[英]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 CLUSTERED
( ID1, 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,表中沒有其他行具有相同的ID1
和ID2
值, ID3 = 9999
。
在我的示例數據中,我只想更新第3行,設置ID3 = 9999
- 因為它具有ID3 = 1
並且表中沒有其他行具有相同的ID1
和ID2
值(其中ID3 <> 1
)。 我不想更新最后一行 - 所以使用count()隔離行不是一種有效的方法。
我想僅在ID3中的當前值為1時才將ID3列更新為9999 ...並且沒有其他行具有相同的ID1和ID2值,其中ID3 = 9999.ID1,ID2和ID3包含唯一鍵和在ID3中設置9999不能復制已存在的鍵值。
我嘗試過多次嘗試將表連接到自身,但我似乎無法獲得只會影響我想要的行的UPDATE語句。
關於如何編寫這個SQL的任何建議?
這是使用common table expression
和count() 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.