Sql server SQL Server/Oracle:如何增加依赖于另一列的索引列?
鉴于下表:Sql server SQL Server/Oracle:如何增加依赖于另一列的索引列?,sql-server,oracle,sql-update,Sql Server,Oracle,Sql Update,鉴于下表: Column1 Column2 idx ------------------- 1 1 0 2 1 0 3 2 0 4 3 0 5 3 0 1 3 0 如何使用UPDATE语句增加SQL Server和Oracle中依赖于column2的idx列 我希望: Column1 Column2 idx -------------------- 1
Column1 Column2 idx
-------------------
1 1 0
2 1 0
3 2 0
4 3 0
5 3 0
1 3 0
如何使用UPDATE
语句增加SQL Server和Oracle中依赖于column2
的idx
列
我希望:
Column1 Column2 idx
--------------------
1 1 0
2 1 1
3 2 0
4 3 0
5 3 1
1 3 2
谢谢大家! 此(或类似)方法应适用于以下两种情况:
;with x as (
select idx, row_number() over(partition by Column2 order by Column1) as new_idx
from tbl
)
update x set idx = new_idx
(这里我假设第6行第1列有一个打字错误-如果没有,应该还有其他的东西来排序)这种(或类似的)方法应该适用于以下两种情况:
;with x as (
select idx, row_number() over(partition by Column2 order by Column1) as new_idx
from tbl
)
update x set idx = new_idx
(这里我假设第6行的第1列有一个拼写错误-如果没有,应该还有其他东西需要订购)对于Oracle,您需要一个MERGE语句:
merge into x using (
select rowid as rid,
row_number() over(partition by Column2 order by Column1) as new_idx
from tbl
) t on (t.rid = x.rowid)
when matched then
set idx = t.new_idx;
您可以使用表的主键列替换联接,而不是使用
rowid
。对于Oracle,您需要一个MERGE语句:
merge into x using (
select rowid as rid,
row_number() over(partition by Column2 order by Column1) as new_idx
from tbl
) t on (t.rid = x.rowid)
when matched then
set idx = t.new_idx;
您可以用表的主键列替换联接,而不必使用
rowid
。您尝试了什么?按第1列列出的idx顺序是什么?对于相同的column2值,是否可以有重复项(因为您已将其显示为非唯一)?您真的需要存储该值,还是在查询表时生成该值(如果删除了column1=5的行,会发生什么情况?)以及为什么这两种数据库类型—您是在试图找到一条对这两种类型都有效的语句,还是为每种类型找到单独的答案?应用idx
列编号的逻辑是什么?它显然不是基于column1
的排序顺序,所以应该应用什么逻辑?类似:排序在这种情况下不相关。我只想让每个Column2值都有一个从0开始的idx。您尝试了什么?按第1列列出的idx顺序是什么?对于相同的column2值,是否可以有重复项(因为您已将其显示为非唯一)?您真的需要存储该值,还是在查询表时生成该值(如果删除了column1=5的行,会发生什么情况?)以及为什么这两种数据库类型—您是在试图找到一条对这两种类型都有效的语句,还是为每种类型找到单独的答案?应用idx
列编号的逻辑是什么?它显然不是基于column1
的排序顺序,所以应该应用什么逻辑?类似:排序在这种情况下不相关。我只想让每列2的值都有一个idx,从0.0开始。可以在SQL Server中工作,但不能在Oracle中工作。谢谢。可以在SQL Server中工作,但不能在Oracle中工作。