我在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
和{的相同值{1}},ID2
。
在我的示例数据中,我只想更新第3行,设置ID3 = 9999
- 因为它有ID3 = 9999
并且表中没有其他行具有相同的ID3 = 1
和ID1
个值(ID2
)。我不想更新最后一行 - 所以使用count()来隔离行并不是一种有效的方法。
如果ID3中的当前值为1,我想将ID3列更新为9999 ONLY 。并且没有其他行具有相同的ID1和ID2值,其中ID3 = 9999。 ID1,ID2和ID3包含唯一键,ID3中的设置9999不能复制已存在的键值。
我尝试过多次尝试将表连接到自身,但我似乎无法获得只会影响我想要的行的UPDATE语句。
有关如何编写此SQL代码的任何建议吗?
答案 0 :(得分:2)
以下是使用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;