sql >> Databasteknik >  >> RDS >> Oracle

Oracle-konverterar SQL till ANSI SQL

Det här avsnittet orsakar förmodligen problemet:

  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

För att göra detta lite enklare kan vi ordna om WHERE klausul för att ordna tabellerna efter hur de relaterar:

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

Vi har C gick med i MAST med C som "drivrutin"-tabellen och hämtar data från MAST där det matchar (en vänsterkoppling):

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'

Sedan måste vi lägga till STPO till kopplingarna:

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

När vi lägger ihop allt får vi:

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

Så sagt , även om (+) fungerar för vänster/höger/yttre kopplingar, Oracle rekommenderar inte använder den :




  1. Oracle FETCH FIRST 1 ROW med UNION ALL-satsen

  2. Är det bra att alltid använda join-klausul i Oracle?

  3. Hur låser man bord med kodantändare?

  4. Hur gör man time_to_minute i Mysql?