【问题标题】:SQL Self-JOIN To Update rowsSQL Self-JOIN 更新行
【发布时间】:2014-04-03 13:04:02
【问题描述】:

我在 SQL Server 中有一个表,其中包含行,我需要更新其中的一些行,具体取决于同一个表中是否存在其他行。表格和示例数据如下所示:

SQL Server 表:

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

它在 (ID1, ID2, ID3) 上有一个 PRIMARY KEY CLUSTERED - 这意味着复合键必须是唯一的。

样本数据:

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 相同的值,@987654329 @。

在我的示例数据中,我只想更新第 3 行,设置 ID3 = 9999 - 因为它有 ID3 = 1 并且表中没有其他行具有相同的 ID1ID2 值(其中ID3 &lt;&gt; 1)。我不想更新最后一行 - 所以使用 count() 来隔离行不是一种有效的方法。

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

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

关于如何编写此 SQL 的任何建议?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 2013-09-12
      • 2013-01-07
      • 2015-07-29
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      相关资源
      最近更新 更多