使用TOP与自联接进行更新

时间:2016-08-11 17:30:07

标签: sql sql-server tsql

根据外键的最小值更新表时效率更高?

在这个例子中,我将删除带有标志集的行。然后我想在具有最小fk_id

的行上设置标志

表格布局:

+----+------------+-----------+------------+
| id | fk_id      | fk_id2    | some_flag  |
+----+------------+-----------+------------+
|  1 | 21         | 1010101   |          1 |
|  2 | 22         | 1010101   |          0 |
|  3 | 23         | 1010101   |          0 |
|  4 | 24         | 1010101   |          0 |
+----+------------+-----------+------------+

我的方法是使用以下

加入表格
Update t1
set some_flag = 1
From TableA t1
Left Join TableA t2
on t1.fk_id2 = t2.fk_id2 AND t1.fk_id > t2.fk_id
where t1.fk_id2 = 1010101 AND t2.fk_id2 IS NULL

我觉得这样效率不高,必须有更好的方法。

考虑基于select语句进行更新,但也许这并不是更好。我认为我的解决方案对于包含大量字段的表来说更糟糕。

1 个答案:

答案 0 :(得分:2)

使用窗口功能:

with toupdate as (
      select a.*, row_number() over (partition by fk_id2 order by fk_id) as seqnum
      from table a
     )
update toupdate
    set some_flag = 1
    where seqnum = 1;

无需jointop

相关问题