Объединить один и тот же столбец из нескольких таблиц - PullRequest
1 голос
/ 06 марта 2019

Ниже мой текущий код.Я не уверен, что лучше всего изменить это, чтобы получить нужные мне результаты.

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 года. Имеется 12 таблиц с одной и той же базой данных (201804, 201805, 201806 и т. Д.), Которые имеют одинаковые столбцы, но относятся к другому месяцу в году.

В идеале я хочу один раз объединить столбцы из T5, но поискать все 12 таблиц в базе данных, чтобы получить данные, соответствующие датам.

Я думал о UNION, но не уверен, какчтобы работать в этом.

Любая помощь будет принята с благодарностью!

Спасибо

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Трудно сказать без дополнительных подробностей, таких как объяснение и данные шага 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, чтобы сообщить оптимизатору, что они содержат только данные за один месяц, если они не существуют, попробуйте добавить условие WHERE к каждому выбору, например, WHERE E_PST_DTE BETWEEN DATE '2018-04-01' AND DATE '2018-04-30'.

Конечно, всегда проверяйте объяснение, если план действительно меняется ...

0 голосов
/ 06 марта 2019

Вы можете изменить свой код, связанный с таблицей 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 
...