Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle-Преобразуване на SQL в ANSI SQL

Този раздел вероятно причинява проблема:

  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

За да направим това малко по-лесно, нека пренаредим WHERE клауза за подреждане на таблиците според връзката им:

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

Имаме C се присъедини към MAST използвайки C като таблица "драйвер" и събиране на данни от MAST където съвпада (ляво съединение):

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'

След това трябва да добавим STPO към съединенията:

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

Събирайки всичко заедно, получаваме:

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

Това каза , въпреки че (+) работи за леви/десни/външни съединения, Oracle препоръчва не използвайки го :




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Въпрос за композитен първичен ключ / външен ключ на Oracle

  2. Как да получите информация за грешка при компилиране в Oracle/TOAD

  3. Предотвратяване на SQL инжектиране с динамична SQL ALTER USER заявка

  4. съхранена процедура за избиране на всички редове от таблицата в Oracle

  5. Oracle MERGE:задейства се само NOT MATCHED