连接多个表中的同一列
Join same column from multiple tables
下面是我当前的代码。我不确定修改它以获得我需要的结果的最佳方法是什么。
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 但不确定如何在其中工作。
如有任何帮助,我们将不胜感激!
谢谢
您可以更改与 table t5 相关的代码,在一个子查询上使用左连接,select union all 用于您需要的所有包......(我已经命名子查询 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
如果没有其他详细信息(如解释和 QueryLog 步骤数据),很难判断。
基于@scaisEdge 的回答:
您可以尝试将前两个联接移动到 Derived Table 以尽早应用 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'
。
当然,如果计划实际发生变化,请始终检查说明...
下面是我当前的代码。我不确定修改它以获得我需要的结果的最佳方法是什么。
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 但不确定如何在其中工作。
如有任何帮助,我们将不胜感激!
谢谢
您可以更改与 table t5 相关的代码,在一个子查询上使用左连接,select union all 用于您需要的所有包......(我已经命名子查询 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
如果没有其他详细信息(如解释和 QueryLog 步骤数据),很难判断。
基于@scaisEdge 的回答:
您可以尝试将前两个联接移动到 Derived Table 以尽早应用 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'
。
当然,如果计划实际发生变化,请始终检查说明...