You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:05:32