0

3 つのテーブルを生成する SQL ステートメントを作成する必要があります。

個別に実行すると、3 つのテーブルを作成できる個別の SQL コードがあります。

select t.TRADE_ID, t.TRADE_VERSION, t.TRADE_SOURCE_SYSTEM, tl.LINK_PARENT_ID, 
tl.LINK_PARENT_VERSION, tc.CHARGE_AMOUNT, tc.CHARGE_SCOPE FROM EQ_MO_TRADE (NOLOCK) t, EQ_MO_TRADE_CHARGE (NOLOCK) tc, EQ_MO_TRADE_LINKAGE (NOLOCK) tl 
WHERE t.TRADE_OID = tl.TRADE_OID
AND t.TRADE_OID = tc.TRADE_OID
AND tl.LINK_TYPE = 'Allocation'
AND tc.CHARGE_NAME = 'Commission'
AND tc.CHARGE_AMOUNT != 0.0

表 2

   select aD.ALLOCATION_ID, aD.ALLOCATION_VERSION, aD.ALLOCATION_SOURCE_SYSTEM, 
    al.LINK_PARENT_ID, al.LINK_PARENT_VERSION, ac.CHARGE_AMOUNT FROM EQ_MO_ALLOCATION_DETAIL aD, EQ_MO_ALLOCATION_DETAIL_CHARGE ac, EQ_MO_ALLOCATION_INSTR_LINKAGE al, EQ_MO_ALLOCATION_INSTR aI 
    WHERE  aD.ALLOCATION_DETAIL_OID = ac.ALLOCATION_DETAIL_OID
    AND aD.ALLOCATION_INSTR_ID = aI.ALLOCATION_INSTR_ID
    AND aI.ALLOCATION_INSTR_OID = al.ALLOCATION_INSTR_OID
    AND ac.CHARGE_NAME = 'Commission'
    AND ac.CHARGE_AMOUNT != 0.0
    AND ac.CHARGE_AMOUNT != -1.0
    and aD.ALLOCATION_ID in 

 (select tl.LINK_PARENT_ID FROM EQ_MO_TRADE t, EQ_MO_TRADE_CHARGE tc, EQ_MO_TRADE_LINKAGE tl 
    where t.TRADE_OID = tl.TRADE_OID
    AND t.TRADE_OID = tc.TRADE_OID
    AND tl.LINK_TYPE = 'Allocation'
    AND tc.CHARGE_NAME = 'Commission'
    AND tc.CHARGE_AMOUNT != 0.0) 

したがって、表 2 は、表 1 の列からの入力を描画します。表 3 は、表 2 の列からの入力を描画します。

これらの SQL ステートメントをリファクタリングして、コードの重複を取り除き、列の値を次のテーブルに簡単に渡すにはどうすればよいですか。

これらの SQL を 1 つにまとめることができますか?

編集: DBVisualizer を介した Netezza DB クエリ

4

1 に答える 1

0

できますよ!必要な列を正確に知るのに役立つかもしれませんが、次の方法でうまくいくはずです。FROMああ、暗黙の結合構文 (コンマ区切り句)を使用するよりも、結合を常に明示的に修飾する方が良いと考えられています。

WITH Charged_Allocated_Commission (trade_id, trade_version, trade_source_system, link_parent_id, link_parent_version, charge_amount, charge_scope) AS
     SELECT t.trade_id, t.trade_version, t.trade_source_system,
            tl.link_parent_id, tl.link_parent_version, 
            tc.charge_amount, tc.charge_scope
     FROM Eq_Mo_Trade t
     JOIN Eq_Mo_Trade_Linkage tl
       ON tl.trade_oid = t.trade_oid
          AND tl.link_type = 'Allocation'
     JOIN Eq_Mo_Trade_Charge tc
       ON tc.trade_oid = t.trade_oid
          AND tc.charge_name = 'Commission'
          AND tc.charge_amount != 0.0)
SELECT cac.trade_id, cac.trade_version, cac.trade_source_system, 
       cac.link_parent_id, cac.link_parent_version, 
       cac.charge_amount, cac.charge_scope,
       ad.allocation_version, ad.allocation_source_system,  
       -- I'm fairly certain these are duplicates of cac.trade_version/_source_system...
       al.link_parent_id, al.link_parent_version,
       ac.charge_amount
FROM Charged_Allocated_Commission cac
JOIN Eq_Mo_Allocation_Detail ad
  ON ad.allocation_id = cac.link_parent_id
JOIN Eq_Mo_Allocation_Detail_Charge ac
  ON ac.allocation_detail_oid = ad.allocation_detail_oid
     AND ac.charge_name = 'Commission'
     AND ac.charge_amount NOT IN (0.0, -1.0)
JOIN Eq_Mo_Allocation_Instr ai
  ON ai.allocation_instr_id = ad.allocation_instr_id
JOIN Eq_Mo_Allocation_Instr_Linkage al
  ON al.allocation_instr_oid = ai.allocation_instr_oid

レイアウトについてもう少し知らなければ、他に何が排除される可能性があるかを知ることは困難です。
いくつかのメモ:

  • Eq_Mo_Trade_Charge.charge_amountEq_Mo_Allocation_Detail_Charge.charge_amountは小数/通貨型であり、ある種の浮動小数点型/実数型ではないと想定しています。それらがフロートである場合、条件が機能しないだけでなく、正確な量も保存されません。
  • すべてにプレフィックスを付けるという「ノイズ」Eq_Mo_...は、少し身に着けています。Netezza は、代わりにテーブルを配置できるスキーマをサポートしていませんか?
于 2013-01-17T17:13:12.810 に答える