一个SQL语句产生三个表

时间:2013-01-17 16:33:44

标签: sql netezza

我需要创建一个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合并为一个?

编辑:Netezza DB通过DBVisualizer查询

1 个答案:

答案 0 :(得分: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是否不支持可以放置表格的模式?