2つの同じクエリのマイナス(を除く)は、空でない結果を返します

StackOverflow https://stackoverflow.com/questions/19833356

  •  25-07-2022
  •  | 
  •  

質問

次のSQLに問題があります。なぜ地球上で2つの2つのクエリをマイナスして、空でない結果を返すのでしょうか?私はユニオンの代わりに「ユニオンオール」を試しましたが、他の多くのことを試しましたが、どれもうまくいきませんでした。お知らせ下さい。

    SELECT y.segment1 po_num, fad.seq_num seq, fdst.short_text st
              FROM applsys.fnd_attached_documents fad,
                   applsys.fnd_documents fd,
                   applsys.fnd_documents_short_text fdst,
                   po_headers_all y
             WHERE     1 = 1
                   AND fad.pk1_value(+) = y.po_header_id
                   AND fad.entity_name = 'PO_HEADERS'
                   AND fad.document_id = fd.document_id
                   AND fd.datatype_id = 1
                   and fad.seq_num>=100
                   AND fdst.media_id = fd.media_id
                   and y.type_lookup_code='STANDARD'
                   AND NVL(y.CANCEL_FLAG,'N')='N'
                 --  and y.segment1 in (100,1000,100,650,26268)
                --   and y.segment1=1000
            UNION 
            SELECT poh.segment1, 1, '1' --null, null
              FROM    po.po_headers_all poh
                   LEFT JOIN
                      (SELECT fad1.pk1_value
                         FROM applsys.fnd_attached_documents fad1,
                              applsys.fnd_documents fd1
                        WHERE     1 = 1
                              AND fad1.entity_name = 'PO_HEADERS'
                              AND fad1.document_id = fd1.document_id
                              and fad1.seq_num>=100
                              AND fd1.datatype_id = 1) sub1
                   ON poh.po_header_id = sub1.pk1_value
             WHERE sub1.pk1_value IS NULL 
                        and poh.type_lookup_code='STANDARD'
                        AND NVL(poh.CANCEL_FLAG,'N')='N'
                      --  and poh.segment1 in (100,1000,100,650,26268) 
                      --  and poh.segment1=1000                       
          --   and poh.segment1=650)              
          minus
   SELECT y.segment1 po_num, fad.seq_num seq, fdst.short_text st
              FROM applsys.fnd_attached_documents fad,
                   applsys.fnd_documents fd,
                   applsys.fnd_documents_short_text fdst,
                   po_headers_all y
             WHERE     1 = 1
                   AND fad.pk1_value(+) = y.po_header_id
                   AND fad.entity_name = 'PO_HEADERS'
                   AND fad.document_id = fd.document_id
                   AND fd.datatype_id = 1
                   and fad.seq_num>=100
                   AND fdst.media_id = fd.media_id
                   and y.type_lookup_code='STANDARD'
                   AND NVL(y.CANCEL_FLAG,'N')='N'
                   --and y.segment1 in (100,1000,100,650,26268)
                   --and y.segment1=1000
            UNION 
            SELECT poh.segment1, 1, '1'--null,null
              FROM    po.po_headers_all poh
                   LEFT JOIN
                      (SELECT fad1.pk1_value
                         FROM applsys.fnd_attached_documents fad1,
                              applsys.fnd_documents fd1
                        WHERE     1 = 1
                              AND fad1.entity_name = 'PO_HEADERS'
                              AND fad1.document_id = fd1.document_id
                              and fad1.seq_num>=100
                              AND fd1.datatype_id = 1) sub1
                   ON poh.po_header_id = sub1.pk1_value
             WHERE sub1.pk1_value IS NULL 
                        and poh.type_lookup_code='STANDARD'
                        AND NVL(poh.CANCEL_FLAG,'N')='N'
                      --  and poh.segment1 in (100,1000,100,650,26268)
                      --  and poh.segment1=1000
                      --   and poh.segment1=650)
役に立ちましたか?

解決

括弧を使用します。今、あなたはやっています ((set1 UNION set2) MINUS set1) UNION set2 あなたがするつもりだった間 (set1 UNION set2) MINUS (set1 UNION set2).

言い換えれば、set1とset2を統合し、それからset1を削除し、それとset2を統合しますが、おそらくset1とset2のユニオンを取得し、それからset1とset2のユニオンを削除するつもりでした。 UNIONMINUS 同じ優先順位を持ち、遭遇した順序で処理されます。

他のヒント

問題は、まず、最初の2つのクエリの組み合わせを行い、次に3番目のクエリをマイナスしてから、結果を4番目のクエリと結合することです。

ご了承ください UNION [ALL]MINUS 同じ優先事項があります。基本的に、私たちが詳細を無視した場合、あなたはしています:

SELECT query1
UNION
SELECT query2
MINUS
SELECT query1
UNION
SELECT query2

これらすべてのセット演算子は同じ優先事項を持っているため、1つずつ評価します。SELECT query1 MINUS SELECT query2 UNION SELECT query1 返す必要があります query2. 。次に、最後 UNION 適用され、結果は次のとおりです SELECT query2 UNION SELECT query2, 、もちろんです query2.

これを解決するには、このようなことをする必要があります。

SELECT * FROM (SELECT query1
               UNION
               SELECT query2)
MINUS
SELECT * FROM (SELECT query1
               UNION
               SELECT query2)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top