与甲骨文中的连接方式重复


select RP.COUNTRYID,RP.PRDCODE,
  RP.REPID,
  RP.CHANNELID,
  RP.CUSTOMERID,
  RP.DIVISION,
  RP.WWCOGS_GAUSS,
  RP.WWCOGS_SAP,
  RP.WWCOGS_BusLine,
  RP.CURRID ,
  ADD_MONTHS(to_date('01-01-'||rp.year,'DD-MM-YYYY'),level-1) KFDATE
  from 
(SELECT CP.COUNTRYID,
  CP.PRDCODE,
  CP.REPID,
  CP.CHANNELID,
  CP.CUSTOMERID,
  IP.DIVISION,
  CP.WWCOGS_GAUSS,
  CP.WWCOGS_SAP,
  CP.WWCOGS_BusLine,
  CP.year,
  CP.CURRID from
(select distinct IBC.COUNTRYID ,
       decode(ls.dmdunit,null,mwa.ProductName,ls.dmdunit) PRDCODE,
    ReportingUnit REPID,
    '99' CHANNELID,
    IBC.COUNTRYID CUSTOMERID ,
    (
    CASE
      WHEN MWA.COGSSourceCF LIKE '%Gauss%'
      THEN MWA.COGSPriceCF * MWA.ExchRate
      ELSE NULL
    END) WWCOGS_GAUSS,
    (
    CASE
      WHEN MWA.COGSSourceCF LIKE '%SAP%'
      THEN MWA.COGSPriceCF * MWA.ExchRate
      ELSE NULL
    END) WWCOGS_SAP,
    (
    CASE
      WHEN MWA.COGSSourceCF NOT LIKE '%Gauss%'
      AND MWA.COGSSourceCF NOT LIKE '%SAP%'
      THEN MWA.COGSPriceCF * MWA.ExchRate
      ELSE NULL
    END) WWCOGS_BusLine,
    mwa.year,
  IRC.CURRID
 from BAM.M_WWCOGS_AREA MWA,
  MICSTAG.M_IBP_REPUNIT_CURRENCY IRC,
  micstag.M_IBP_BDREPORTINGCOUNTRY IBC
  ,MICSTAG.M_LOCALPRODUCT_STAG LS
WHERE MWA.ReportingUnit=IRC.REPID
--and mwa.productname='FR21030390085'
--and MWA.GaussCountry='BE BELGIUM'
AND IBC.COUNTRYPLANNINGGROUP =MWA.GaussCountry 
and IBC.businessdivision=31
and MWA.COGSPriceCF <>0
  and ls.REPORTINGUNITID(+)=mwa.ReportingUnit
  and ls.IBPLOCALPRDID(+)= mwa.ProductName ) CP, micstag.M_IBP_PRODUCT IP
  where CP.PRDCODE=IP.PRDID) RP
    CONNECT BY level <= 12  ;

上面的查询正在获得不需要的重复,如果我使用 Distinct 查询将永远运行。要求根据 RP 结果集中的年份复制记录考虑年份值是 2019 年,而不是 12 条记录应来自 2019 年 1 月 1 日至 2019 年 12 月 1 日。可以有多个年份值

按级别 <= 12 连接技巧适用于 DUAL,因为该表返回一行。当它们以结果集为基础返回多行时,事情会更加混乱,因为 CONNECT BY 会生成一个产品。这就是您收到重复项的原因。

您需要做的是为连接指定一些其他条件。理想情况下,您将在投影中有一个主键 - 我将假设它是 REPID,所以如果它是不同的东西,您需要调整它。无论如何,您将需要这样的东西:

) RP
    CONNECT BY level <= 12 
            and rp.repid = prior rp.repid
            and prior sys_guid() is not null

prior sys_guid()位可防止ORA-01436: CONNECT BY loop in user data.

最新更新