sql >> Database >  >> RDS >> Oracle

Oracle-conversie van SQL naar ANSI SQL

Dit gedeelte veroorzaakt waarschijnlijk het probleem:

  FROM BOM_CHILDS C
     , XX_MAIN.XX_MAST MAST
     , XX_MAIN.XX_STPO STPO
  WHERE C.MATNR = MAST.MATNR(+)
   AND MAST.STLNR = STPO.STLNR(+)
   AND MAST.STLAN(+) = '1'
   AND MAST.WERKS(+) = C.WERKS
   AND STPO.IDNRK IS NULL

Laten we, om dit een beetje makkelijker te maken, de WHERE . herschikken clausule om de tabellen te ordenen op basis van hoe ze zich verhouden:

FROM BOM_CHILDS C
 , XX_MAIN.XX_MAST MAST
 , XX_MAIN.XX_STPO STPO
-- Joining C to MAST
WHERE C.MATNR = MAST.MATNR(+)
  AND C.WERKS = MAST.WERKS(+)
  AND MAST.STLAN(+) = '1'
-- Joining MAST to STPO
  AND MAST.STLNR = STPO.STLNR(+)
  AND STPO.IDNRK IS NULL

We hebben C lid geworden van MAST met behulp van C als de "chauffeur"-tabel en het ophalen van gegevens van MAST waar het overeenkomt (een linker join):

FROM BOM_CHILDS C
LEFT JOIN XX_MAIN.XX_MAST MAST
  ON C.MANTR = MAST.MANTR
 AND C.WERKS = MAST.WERKS
 AND MAST.STLAN = '1'

Dan moeten we STPO . toevoegen naar de joins:

LEFT JOIN XX_MAIN.XX_STPO STPO
  ON MAST.STLNR = STPO.STLNR
 AND STPO.IDNRK IS NULL

Alles bij elkaar krijgen we:

FROM BOM_CHILDS C
LEFT JOIN XX_MAIN.XX_MAST MAST
  ON C.MANTR = MAST.MANTR
 AND C.WERKS = MAST.WERKS
 AND MAST.STLAN = '1'
LEFT JOIN XX_MAIN.XX_STPO STPO
  ON MAST.STLNR = STPO.STLNR
 AND STPO.IDNRK IS NULL

Dat gezegd hebbende , hoewel (+) werkt voor left/right/outer joins, Oracle raadt niet aan het gebruiken :




  1. Oracle:GEEN GROEP OP UITDRUKFOUT

  2. Beheer van gegevensbeveiliging

  3. Willekeurige SQL-tekenreeks uit lijst

  4. GROUP BY, SUM en AVG-query's versnellen