дубликаты с подключением в оракуле - PullRequest
1 голос
/ 23 апреля 2019
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  ;

вышеупомянутый запрос получает нежелательные дубликаты, если я использую разные, запрос выполняется навсегда.REQ.продублируйте записи на основе года в результирующем наборе rp с учетом значения года 2019, тогда как 12 записей должны поступить с 1 января 2019 года по 1 декабря 2019 года.возможно более одного значения года

1 Ответ

0 голосов
/ 23 апреля 2019

Уловка CONNECT BY LEVEL <= 12 прекрасно работает с dual, потому что эта таблица возвращает одну строку. Ситуация усложняется, когда базовый набор результатов возвращает более одной строки, потому что CONNECT BY генерирует продукт. Вот почему вы получаете дубликаты. </p>

Что вам нужно сделать, это указать некоторые дополнительные критерии для подключения. В идеале у вас будет первичный ключ в проекции - я предполагаю, что это 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...