2016-05-18 198 views
1

UNION ALLステートメントを使用せずにこのクエリを再作成しようとしていますが、スカラーサブクエリとモデルの節は試しましたが、どれも望んでいないようです。私のマネージャーは、連合のすべてを使用する必要はありませんが、私は本当に選択肢がOracle SQLのUNION ALLの代替

は、任意のヘルプは、私はあなたのクエリで唯一の真の機能的な違いがでていることに気づいた

SELECT null AS UDA_ID, 
     'Style-Level Attributes' AS UDA_DESC, 
     null AS DISPLAY_TYPE, 
     null AS REQUIRED_IND, 
     null AS ITEM, 
     null AS UDA_TEXT, 
     null AS UDA_DATE, 
     null AS UDA_VALUE 
FROM DUAL 
UNION ALL     
select a.UDA_ID, 
     a.UDA_DESC, 
     a.DISPLAY_TYPE, 
     a.REQUIRED_IND, 
     b.ITEM, 
     b.UDA_TEXT, 
     b.UDA_DATE, 
     b.UDA_VALUE    
from DAL.P_UDA a, 
     FFEDEV.FFE_ITEM_UDA b     
where a.UDA_ID = b.UDA_ID (+)     
AND a.REQUIRED_IND IS NOT NULL  
AND b.ITEM_PARENT IS NULL  
UNION ALL 
SELECT null AS UDA_ID, 
     'Additional Attributes' AS UDA_DESC, 
     null AS DISPLAY_TYPE, 
     null AS REQUIRED_IND, 
     null AS ITEM, 
     null AS UDA_TEXT, 
     null AS UDA_DATE, 
     null AS UDA_VALUE 
FROM DUAL 
UNION ALL     
select a.UDA_ID, 
     a.UDA_DESC, 
     a.DISPLAY_TYPE, 
     a.REQUIRED_IND, 
     b.ITEM, 
     b.UDA_TEXT, 
     b.UDA_DATE, 
     b.UDA_VALUE   
from DAL.P_UDA a, 
     FFEDEV.FFE_ITEM_UDA b     
where a.UDA_ID = b.UDA_ID (+)     
AND a.REQUIRED_IND IS NULL  
AND b.ITEM_PARENT IS NULL 
+0

これは、なぜ「UNION」が作成されたのかを示しています。あなたがそれをすることを強く望むなら、このすべてのクエリの間に 'FULL OUTER JOIN ON(1 = 2)'を使うことができ、 'NVL'や' CASE EXPRESSION'を使ってヌル値を置き換えることができます。 – sagi

+0

結果行をヘッダーとして使用するのは奇妙です。選択した行にはデータのみを含める必要があります。したがって、結果の行に代わりに 'Style-Level Attributes'または 'Additional Attributes'を含む列を追加する必要があります。次に、クエリを動作させることが保証されていません。 'ORDER BY'節がなければ、保証されたソートはありません。 'UNION ALL'の約束は、どのような順序ではなく、結果に行が入ることです。クエリが並列スレッドで実行されると、すべてのレコードが混在する可能性があります。その後、長い間廃止された結合構文をもう使用しないでください。 –

答えて

5

素晴らしいだろうが何であるかが表示されません2つのWHEREUNION ALLの前半では条件があります。

WHERE a.REQUIRED_IND IS NOT NULL 

後半は持っていながら:

WHERE a.REQUIRED_IND IS NULL 

あなたは属性型を含む計算列を生成するCASE表現を使用することができます。

SELECT CASE WHEN a.REQUIRED_IND IS NOT NULL THEN 'Style-Level Attributes' ELSE 'Additional Attributes' END AS AttrType, 
    a.UDA_ID, a.UDA_DESC, a.DISPLAY_TYPE, a.REQUIRED_IND, b.ITEM, b.UDA_TEXT, b.UDA_DATE, b.UDA_VALUE 
FROM DAL.P_UDA a 
LEFT OUTER JOIN FFEDEV.FFE_ITEM_UDA b 
    ON a.UDA_ID = b.UDA_ID 
WHERE b.ITEM_PARENT IS NULL 
ORDER BY AttrType 

このクエリでは唯一の主要な潜在的な後退は、あなたが2つのヌルヘッダー行を失うということです。ここ

CASE WHEN a.REQUIRED_IND IS NOT NULL 
    THEN 'Style-Level Attributes' 
    ELSE 'Additional Attributes' 
END AS UDA_DESC 

とフルクエリです:明確にするために、ここではそれだけでCASE式があることです。しかし、報告目的のために問題はないはずです。あなたの上司がそれらのヌルヘッダー行を主張している場合、それらが合成されたデータであることを伝え、結果セットにそれらを追加する唯一の方法はUNIONです。

+1

あなたは 'REQUIRED_IND IS NOT NULL'を削除する必要があると思います。それはあなたが説明したものです。また、デフォルトのNULL行は失われます。また、正しい結合構文 – sagi

+0

でここに応答する必要があります。これは、最初のステートメントが必須テーブルではなく、デュアルからの選択であるため、無効な識別子を生成します。 – James

+1

レコードごとに属性タイプを含めることができるので、削除した 'null'ヘッダ行は必要ありません。代わりに、このタイプの新しい列を追加しました。 –

関連する問題