SQL自联接更新行

时间:2014-04-03 02:26:26

标签: sql sql-server sql-update self-join

我在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 = 1ID1个值(ID2)。我不想更新最后一行 - 所以使用count()来隔离行并不是一种有效的方法。

如果ID3中的当前值为1,我想将ID3列更新为9999 ONLY 。并且没有其他行具有相同的ID1和ID2值,其中ID3 = 9999。 ID1,ID2和ID3包含唯一键,ID3中的设置9999不能复制已存在的键值。

我尝试过多次尝试将表连接到自身,但我似乎无法获得只会影响我想要的行的UPDATE语句。

有关如何编写此SQL代码的任何建议吗?

1 个答案:

答案 0 :(得分:2)

以下是使用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;