1

我们正在将 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(发票日期)使用的值 >= 108001 和 <= 108031。这些是 JULIAN DAYS(不是儒略日期)。这是一种保留日期的奇怪方法,但它确实有效。108001 = 2008 年 1 月 1 日,108031 = 2008 年 1 月 31 日。

此外,F5542HIS 表将在此示例的更新中包含 WHERE 子句,其中 NSCTRY(世纪)= 20、NSYR(年)= 8 和 NSMNTH(月)= 1。因此,本质上,结构可以采用以下形式:

UPDATE f5542HIS
SET nsaexp=sumaexp, nsuorg-sumuorg, nsecst=sumecst from<union>
where nsctry=20 and nsyr=8 and nsmnth=1

我一直在研究 SQLUpdate以及 SQLMERGE函数。有人可以帮我定义将此语句格式化为 anUPDATEMERGE可以在这里工作的最佳实践吗?

4

0 回答 0