【问题标题】:Conversion of old style join to ansi join in oracle在 oracle 中将旧式联接转换为 ansi 联接
【发布时间】:2020-06-29 14:50:07
【问题描述】:

我有一个巨大的 sql,它是用旧式连接代码编写的,我正在尝试将其更改为 ansi 连接,我没有粘贴选择查询,只是粘贴连接条件以方便使用 ansi join 不会产生任何数据,但旧的会产生。

这是我的旧式加入

 select *****       
 from CHECKING_EXT_CASH_FLW_REP CS, OTP_ALL_REP TP_REP ,
 (select M_LABEL,min(M_ALT_ID) as M_ALT_ID from ING_ALIAS_REP where M_ALT_SYS=@CtpAlternateSystem:C group by M_LABEL) CA,
 (select M_LABEL,min(M_ALT_ID) as M_ALT_ID from ING_ALIAS_REP where M_ALT_SYS=@PtfAlternateSystem:C group by M_LABEL) PA
 where TP_REP.M_REF_DATA=CS.M_REF_DATA
 and TP_REP.M_TP_PFOLIO=CS.M_TP_PFOLIO
 and TP_REP.M_NB=CS.M_NB
 and CA.M_LABEL(+)=TP_REP.M_TP_CNTRPID
 and PA.M_LABEL(+)=TP_REP.M_TP_PFOLIO 
 and CS.M_F_OBSCOM ='N' 

我尝试将其转换为 ansi join,下面是代码

 select **********
 from OTP_ALL_REP TP_REP  
    JOIN  CHECKING_EXT_CASH_FLW_REP CS ON  (TP_REP.M_REF_DATA=CS.M_REF_DATA and TP_REP.M_TP_PFOLIO=CS.M_TP_PFOLIO and TP_REP.M_NB=CS.M_NB )
    RIGHT OUTER JOIN (select M_LABEL,min(M_ALT_ID) as M_ALT_ID from ING_ALIAS_REP where M_ALT_SYS=@CtpAlternateSystem:C group by M_LABEL) CA ON( CA.M_LABEL=TP_REP.M_TP_CNTRPID )
    RIGHT OUTER JOIN (select M_LABEL,min(M_ALT_ID) as M_ALT_ID from ING_ALIAS_REP where M_ALT_SYS=@PtfAlternateSystem:C group by M_LABEL) PA ON (PA.M_LABEL=TP_REP.M_TP_PFOLIO)

旧代码有效,但后者无效,是否有任何我遗漏的内容,或者我的转换有问题。

【问题讨论】:

标签: sql join oracle11g left-join outer-join


【解决方案1】:

在我看来,LEFT (outer) JOIN 可能会胜任这项工作(而不是 RIGHT 一个)。

【讨论】:

  • 是的,左连接有效,但下面的,你能告诉我如何判断那是左还是右看旧式代码
  • 在 Oracle 的 (+) 外连接运算符中,它被放置在“缺少”某些行的表旁边,即另一个表中没有匹配项。根据您将它们放入FROM 子句的方式,即哪个表是“视觉上”的左侧或右侧,您将使用leftright 外连接。在您的示例中,如果您将一个表替换为另一个表并使用 right 连接,您将得到相同的结果。试试看。
【解决方案2】:

我很确定这是您想要的逻辑:

 select *****       
 from OTP_ALL_REP TP_REP join
      CHECKING_EXT_CASH_FLW_REP CS
      on TP_REP.M_REF_DATA = CS.M_REF_DATA and
         TP_REP.M_TP_PFOLIO = CS.M_TP_PFOLIO
         TP_REP.M_NB = CS.M_NB left join
      (select M_LABEL, min(M_ALT_ID) as M_ALT_ID
       from ING_ALIAS_REP
       where M_ALT_SYS = @CtpAlternateSystem:C
       group by M_LABEL
      ) CA
      on CA.M_LABEL = TP_REP.M_TP_CNTRPID left join
      (select M_LABEL, min(M_ALT_ID) as M_ALT_ID
       from ING_ALIAS_REP
       where M_ALT_SYS = @PtfAlternateSystem:C
       group by M_LABEL
      ) PA
      on PA.M_LABEL = TP_REP.M_TP_PFOLIO
where CS.M_F_OBSCOM = 'N' ;

【讨论】:

  • 是的,左连接有效,但下面的,你能告诉我如何判断那是左还是右看旧式代码
  • 我已经阅读了下面的stackoverflow.com/questions/18891148/… 并选择了正确的加入,但这是错误的
  • @user2256825 。 . .我不。我根据查询中的逻辑猜测。如果您汇总两个表,那么这些可能是初始表的查找表。
猜你喜欢
  • 2017-04-08
  • 1970-01-01
  • 2015-10-18
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2021-09-16
相关资源
最近更新 更多