【问题标题】:Join same column from multiple tables连接多个表中的同一列
【发布时间】:2019-03-07 07:20:09
【问题描述】:

以下是我当前的代码。我不确定最好的方法是修改它以获得我需要的结果。

SELECT
T1.SC,
T1.AN,
T1.DOFS_DATE,
T2.M_ID,
T3.OPDT,
T4.MARKER,
T5.E_DTE,
T5.E_TME,
T5.E_PST_DTE,  
T5.E_AMT,
T5.E_NAR_O,
T5.E_NAR_T
FROM E_Base.AR_MyTable T1

LEFT JOIN  E_Base.Translation T2
ON T1.SC = T2.SC
AND T1.AN = T2.AN

LEFT JOIN E_Base.BA T3
ON T2.M_ID = T3.M_ID

LEFT JOIN E_Base.APF T4
ON T3.M_ID = T4.M_ ID
AND MARKER = 54

LEFT JOIN U_DB.TEH_201804 T5
ON T2.M_ID = T5.M_ID
AND T1.DOFS_DATE = T5.E_PST_DTE

QUALIFY ROW_NUMBER() OVER (PARTITION BY T2.M_ID ORDER BY T2.ID_END_DATE DESC, T3.E_END_DATE DESC) = 1 

上面的代码有效。但是,这是我需要帮助的 T5 上的最后一个左连接。

在 T1 中,每个 M_ID 都分配了它自己的 DOFS_DATE,它可以是一年中的任何日期,我想要来自 T5 U_DB.TEH_201804 的数据作为匹配日期。但是,5 U_DB.TEH_201804 仅与 2018 年 4 月有关。有 12 个表具有相同的数据库(201804、201805、201806 等),它们都具有完全相同的列,但与一年中的不同月份相关。

理想情况下,我想将 T5 中的列从左连接一次,但搜索数据库中的所有 12 个表以返回日期对应的数据。

我在考虑 UNION,但不确定如何使用它。

任何帮助将不胜感激!

谢谢

【问题讨论】:

  • 为什么你有 12 个表,其列完全相同但与一年中的不同月份相关,而不是一个表(可以按月分区)?
  • 这超出了我的范围。我所知道的是在月底数据被归档到一个单独的表中。让我的生活变得更加艰难!

标签: sql match union teradata


【解决方案1】:

您可以更改与表 t5 相关的代码,并在子查询上使用左连接为您需要的所有包选择联合......(我已将子查询命名为 TT)

    SELECT
    T1.SC,
    T1.AN,
    T1.DOFS_DATE,
    T2.M_ID,
    T3.OPDT,
    T4.MARKER,
    TT.E_DTE,
    TT.E_TME,
    TT.E_PST_DTE,  
    TT.E_AMT,
    TT.E_NAR_O,
    TT.E_NAR_T
    FROM E_Base.AR_MyTable T1

    LEFT JOIN  E_Base.Translation T2
    ON T1.SC = T2.SC
    AND T1.AN = T2.AN

    LEFT JOIN E_Base.BA T3
    ON T2.M_ID = T3.M_ID

    LEFT JOIN E_Base.APF T4
    ON T3.M_ID = T4.M_ ID
    AND MARKER = 54

    LEFT  JOIN (
                select *
                FROM U_DB.TEH_201804
                UNION ALL 
                select *
                FROM U_DB.TEH_201805
                UNION ALL 
                select *
                FROM U_DB.TEH_201806
                UNION ALL   
                select *
                FROM U_DB.TEH_201807
                UNION ALL 
                .....
            ) TT ON T2.M_ID = TT.M_ID
                AND T1.DOFS_DATE = TT.E_PST_DTE

    QUALIFY ROW_NUMBER() OVER (PARTITION BY T2.M_ID ORDER BY T2.ID_END_DATE DESC, T3.E_END_DATE DESC) = 1 

【讨论】:

  • 这看起来和我要找的完全一样。但是,当我运行查询时,我得到“SELECT Failed. 2646. no more spool space in myusername. 你知道为什么这个查询会这样吗?
  • 可能是您涉及的行太多并且有一些问题.. 谷歌搜索您的错误我发现kedar.nitty-witty.com/blog/…
  • 谢谢!我正在查看的数据库和表很大,所以查询对于我的分配来说可能太大了。如果我只搜索 6 个月,它会完美运行,所以我只需将其拆分为两个单独的查询,然后将数据合并到 excel 中。非常感谢您的帮助和快速响应!
【解决方案2】:

如果没有解释和 QueryLog 步骤数据等其他详细信息,很难判断。

基于@scaisEdge 的回答:

您可以尝试将前两个联接移动到派生表中以提前应用 ROW_NUMBER(可能是因为您只执行外部联接):

SELECT
   dt.*,
   T4.MARKER,
   TT.E_DTE,
   TT.E_TME,
   TT.E_PST_DTE,  
   TT.E_AMT,
   TT.E_NAR_O,
   TT.E_NAR_T
FROM
 (
   SELECT 
      T1.SC,
      T1.AN,
      T1.DOFS_DATE,
      T2.M_ID,
      T3.OPDT
   FROM E_Base.AR_MyTable T1

   LEFT JOIN  E_Base.Translation T2
   ON T1.SC = T2.SC
   AND T1.AN = T2.AN

   LEFT JOIN E_Base.BA T3
   ON T2.M_ID = T3.M_ID

   QUALIFY Row_Number()
           Over (PARTITION BY T2.M_ID
                 ORDER BY T2.ID_END_DATE DESC, T3.E_END_DATE DESC) = 1 
 ) AS dt

LEFT JOIN E_Base.APF T4
ON dt.M_ID = T4.M_ID
AND MARKER = 54

LEFT JOIN
 (
   SELECT *
   FROM U_DB.TEH_201804
   UNION ALL 
   SELECT *
   FROM U_DB.TEH_201805
   UNION ALL 
   SELECT *
   FROM U_DB.TEH_201806
   UNION ALL   
   SELECT *
   FROM U_DB.TEH_201807
   UNION ALL 
   .....
 ) TT
ON dt.M_ID = TT.M_ID
AND dt.DOFS_DATE = TT.E_PST_DTE

它还可以帮助优化器提供有关数据范围的附加信息。这些表应该有 CHECK 约束来告诉优化器它们只包含一个月的数据,如果它们不存在,请尝试向每个 Select 添加 WHERE 条件,例如WHERE E_PST_DTE BETWEEN DATE '2018-04-01' AND DATE '2018-04-30'

当然,如果计划实际发生变化,请务必检查解释...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 2018-12-19
    • 2021-10-29
    • 1970-01-01
    • 2010-09-25
    • 2021-03-26
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多