0

我需要创建一个将生成三个表的 sql 语句。

我有单独的 SQL 代码,如果我单独运行,我可以生成三个表: 表 1

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 合二为一?

编辑:通过 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_amountandEq_Mo_Allocation_Detail_Charge.charge_amount是十进制/货币类型,而不是某种浮点/真实类型。如果它们是浮点数,则不仅条件不起作用,您也不会存储确切的数量。
  • 将所有内容都以前缀的“噪音”Eq_Mo_...有点磨损。Netezza 是否不支持可以放置表的模式?
于 2013-01-17T17:13:12.810 回答