2016-05-20 5 views
-2

これは、問合せのANSI SQLへの変換に関するものです。私はOracleの古い構文でこの問合せを作成しようとしましたが、次のエラーが投げられました。調査の結果、ANSI SQLがそのような要件をサポートしていることがわかりました。Oracle Conveting SQLからANSI SQLへ

ERROR:表はここ

が動作しているが、方法がこれがあるかどうかを知るために素晴らしいことだ、私が書いたクエリが再書き込み可能なある最大1つの他のテーブルの先端に、外側接合してもよいですANSI-SQLでは、または古い外部結合構文を使用します。私はun句が他の人がうまく動作するように、再構成されるべきユニオンクエリを探しています。このセクションでは、おそらく問題を引き起こしている

WITH BOM_PARENT AS (
    SELECT MX.SAP_MATNR MATNR 
     , TRIM(I.IPRODUCTION) IPRODUCTION 
     , TRIM(I.IDRAWING) IDRAWING 
     , TRIM(M.BCHLD) BCHLD 
     , M.BSEQ BSEQ 
     , PX.WERKS WERKS 
     , M.BPSCP MENGE 
     , UX.SAP_UOM MEINS 
     , I.IUMS 
    FROM XX_MAIN.XX_BPCS_IIM I 
     , XX_MAIN.XX_BPCS_MPB M 
     , XX_MAIN.XX_MATER_XREF MX 
     , XX_MAIN.XX_TRUNK_XREF PX 
     , XX_MAIN.XX_MP_UNIT_XREF UX 
    WHERE TRIM(I.IPRODUCTION) = TRIM(M.BPROD) 
     AND TRIM(MX.PROD_MATNR) = TRIM(I.IPRODUCTION) 
     AND MX.CONV_FACTOR = TO_CHAR(I.IUMCN) 
     AND I.IUMS = UX.LEGACY_UOM 
     AND UX.SOURCE = 'AP' 
     AND I.SOURCE = PX.SOURCE 
     AND I.ENTITY = PX.LEGACY_PLANT 
     AND I.ENTITY = 'SG' 
     AND I.IITYP = '4' 
     --AND PX.WERKS IN ('1379') 
     AND MX.SAP_MTART <> 'ZPRD' 
    ) 
    , BOM_CHILDS AS 
    (
    SELECT B.*, 
      X.SAP_MATNR IDNRK 
      , ROW_NUMBER() OVER (PARTITION BY B.MATNR,B.WERKS ORDER BY B.MATNR,B.WERKS) ID_ITEM_NO 
      , X.PROD_MATNR IDNRK_IPRODUCTION 
      , X.DRAWING_MATNR IDNRK_IDRAWING  
     FROM BOM_PARENT B 
      , XX_MAIN.XX_MATER_XREF X 
    WHERE B.BCHLD = TRIM(X.PROD_MATNR) 
     AND X.SAP_MTART <> 'ZPRD' 
     AND X.SOURCE = 'AP' 
    ) 
    SELECT DISTINCT C.MATNR 
     , C.IPRODUCTION 
     , C.IDRAWING 
     , C.WERKS 
     , (C.ID_ITEM_NO*10) ID_ITEM_NO 
     , C.BSEQ 
     , C.IDNRK 
     , C.IDNRK_IPRODUCTION 
     , C.IDNRK_IDRAWING 
     , C.MENGE BPSCP 
     , STPO.MENGE STPO_MENGE 
     , C.MEINS MEINS 
     , C.IUMS IUMS 
     , STPO.MEINS STPO_MEINS 
     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 = C.IDNRK 
    UNION 
    SELECT DISTINCT C.MATNR 
     , C.IPRODUCTION 
     , C.IDRAWING 
     , C.WERKS 
     , (C.ID_ITEM_NO*10) ID_ITEM_NO 
     , C.BSEQ 
     , C.IDNRK 
     , C.IDNRK_IPRODUCTION 
     , C.IDNRK_IDRAWING 
     , C.MENGE BPSCP 
     , STPO.MENGE STPO_MENGE 
     , C.MEINS MEINS 
     , C.IUMS IUMS 
     , STPO.MEINS STPO_MEINS 
     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 
    ORDER BY MATNR,WERKS,ID_ITEM_NO,BSEQ; 

答えて

2

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 

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 

右/左用 (+)作品/外部結合にもかかわらず、語っ10

Oracle recommends not using it

Oracleは、FROMOUTER JOIN構文ではなく、Oracleの結合演算子を使用することをお勧めします。外は、Oracleがオペレータ(+)に参加使用するクエリに参加FROMOUTER JOIN構文には適用されません。次のルールと制限の対象としている:...氏Llama..How @

+0

おかげで私は、nullではないのですかSTPO.IDNRK = C.IDNRKのようなstpo.idnrkの値とヌル値(ユニオンクエリの最初のクエリは一致するIDNRKを取得します)。ユニオンを書くのではなく、1つのクエリでこのロジックを持つことは可能ですか? – Tina

+0

これは、外部結合の機能です。一致する場合は値を取得し、一致しない場合はNULLを取得します。内部結合の結果を外部結合と結合すると、外部結合のみと同じ結果が常に得られます。 –

+0

@Tina - この回答があなたの問題の解決に役立つ場合は、投票矢印の下にあるチェックマークを使用して[受け入れ可能とマークする](https://stackoverflow.com/help/someone-answers)を検討してください。ありがとうございました! –

関連する問題