SQL Server中替代Oracle rowid的方法咨询(附具体SQL语句)
Oracle转SQL Server语句改造方案
核心问题处理
1. ROWID替代方案
Oracle的ROWID是物理行唯一标识符,SQL Server中无对应概念,需用表的唯一主键/唯一标识列替换。假设reskontro.erkrysskid表的唯一标识组合为kundenr, resknr, fakturanr, krysskidid(若有单一主键列如id可直接使用),后续改造基于该组合列替换ROWID。
2. NVL转ISNULL
直接将所有nvl(列, 默认值)替换为isnull(列, 默认值)即可。
3. DECODE转CASE
原语句中a.rowid = decode(a.reskfunknr,31,a.rowid,b.rowid)的逻辑拆解:
- 当
a.reskfunknr = 31时,条件恒成立(a.rowid = a.rowid) - 当
a.reskfunknr != 31时,条件为a和b是同一行(a.rowid = b.rowid)
转成CASE表达式后等价于:
CASE WHEN a.reskfunknr = 31 THEN 1 = 1 ELSE (a.kundenr = b.kundenr AND a.resknr = b.resknr AND a.fakturanr = b.fakturanr AND a.krysskidid = b.krysskidid) END
改造后的完整SQL Server语句
select sum( isnull( (select sum(b.restsaldo) from reskontro.erkrysskid b where 1=1 and b.fakturanr = a.fakturanr and b.kundenr = a.kundenr and b.resknr = b.resknr -- 此条件恒成立,可保留或删除 and ( CASE WHEN a.reskfunknr = 31 THEN 1 = 1 ELSE (a.kundenr = b.kundenr AND a.resknr = b.resknr AND a.fakturanr = b.fakturanr AND a.krysskidid = b.krysskidid) END ) and isnull(b.restsaldo,0) <> 0 and b.krysskidid <= a.krysskidid and not exists (select * from reskontro.erkrysskid c where b.kundenr = c.kundenr and b.resknr = c.resknr and a.resklinr < c.resklinr and a.krysskidid < c.krysskidid and b.fakturanr = c.fakturanr and c.reskfunknr in (31,75) and isnull(c.attfort,-1) = -1) ),0 ) ) as restsaldo from reskontro.erkrysskid a where 1=1 and a.kundenr = 1 and a.resknr = 1
额外说明
- 原语句中
b.resknr = b.resknr是恒成立条件,可直接删除简化语句; - 若表有单一主键列(如
erkrysskid_id),ELSE分支可简化为a.erkrysskid_id = b.erkrysskid_id,无需组合列; - 若不确定唯一标识列,可查看表的主键定义,主键必然是唯一标识一行的列/组合。
内容的提问来源于stack exchange,提问作者Johnny Gunn
相关产品推荐
相关产品推荐

