我们正在将PRODUCTION数据库从MSSQL迁移到Oracle 11G。此过程的一部分是重新创建从TSQL到Oracle SQL的一些现有存储过程。作为Oracle的新手,我对特定情况下的最佳实践提出了疑问。
基本上,我有一个表来总结销售交易表中的数据。表格的基本布局(F5542HIS)如下(*表示索引):
*NSAN8 (sold_to)
*NSSHAN (ship_to)
*NSMCU (sold_from)
*NSITM (item)
*NSCTRY (Century)
*NSYR (year)
*NSMNTH (month)
*NSDCTO (Order Type)
*NSLNTY (Order Line Sales Type)
NSAEXP (Total Extended Price)
NSSOQS (Total Units Shipped)
NSECST (Total Extended Cost)
在我第一次使用脚本时,我使用主索引值填充表格(由*表示)。
在第二遍中,我需要对此表进行更新以填充事务表中的求和值。交易表是F4211(未结订单)和F42119(订单历史),因此需要联合。
所以,我需要根据以下select语句进行更新,该语句返回正确的数据:
select sum(cast(sdaexp as numeric)) sumaexp,
sum(cast(sduorg as numeric)) sumuorg,
sum(cast(sdecst as numeric)) sumecst
from PRODDTA.F4211 a inner join proddta.f5542his b
on(a.sdan8 = b.nsan8 and
a.sdshan = b.nsshan and
a.sditm = b.nsitm and
a.sdlnty = b.nslnty and
a.sddcto = b.nsdcto and
a.sdlnty = b.nslnty and
ltrim(rtrim(a.sdmcu)) = ltrim(rtrim(b.nsmcu)) )
where sdtrdj >= 108001 and
sdtrdj <= 108031 and
group by sdaexp, sduorg, sdecst
UNION
select sum(cast(sdaexp as numeric)) sumaexp,
sum(cast(sduorg as numeric)) sumuorg,
sum(cast(sdecst as numeric)) sumecst
from PRODDTA.F4211 a inner join proddta.f5542his b
on(a.sdan8 = b.nsan8 and
a.sdshan = b.nsshan and
a.sditm = b.nsitm and
a.sddcto = b.nsdcto and
a.sdlnty = b.nslnty and
ltrim(rtrim(a.sdmcu)) = ltrim(rtrim(b.nsmcu)) )
where sdivd >= 108001 and
sdivd <= 108031 and
group by sdaexp, sduorg, sdecst
请注意,SDTRDJ(交易日期)和SDIVD(发票日期)使用值&gt; = 108001和&lt; = 108031.这些是JULIAN DAYS(不是julian日期)。这是一种保留日期的奇怪方法,但它有效。 108001 = 2008年1月1日,108031 = 2008年1月31日。
此外,F5542HIS表在此示例的更新中将有一个WHERE子句,其中NSCTRY(Century)= 20,NSYR(Year)= 8,NSMNTH(Month)= 1.所以基本上,结构可能是在表格中:
UPDATE f5542HIS
SET nsaexp=sumaexp, nsuorg-sumuorg, nsecst=sumecst from<union>
where nsctry=20 and nsyr=8 and nsmnth=1
我一直在查看SQL Update
以及SQL MERGE
函数。有人可以帮我定义将此语句格式化为可在此处使用的UPDATE
或MERGE
的最佳做法吗?