根据外键的最小值更新表时效率更高?
在这个例子中,我将删除带有标志集的行。然后我想在具有最小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语句进行更新,但也许这并不是更好。我认为我的解决方案对于包含大量字段的表来说更糟糕。
答案 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;
无需join
或top
。