Внутреннее объединение в нескольких подзапросах? - PullRequest
1 голос
/ 22 октября 2019

Я пишу выборку, которая содержит несколько подзапросов (только один во фрагменте кода ниже), однако мне трудно возвращать только те строки, в которых есть 1 существующая строка в подзапросе AIRFI_TCD. Я хочу, чтобы строки отображались только при наличии соответствующего CLT_ID в таблицах TSUMM и TPPPRFL. Я попробовал пункт HAVING COUNT (см. Ниже), но это не сработало. Я не знаю, как присоединиться к ЦУММ с помощью моего подзапроса.

      SELECT RIGHT(DIGITS (A.CLT_ID),9) ||  A.PGM_ID ||
         RIGHT(DIGITS (A.PGM_ACCT_SQNBR),4) AS BN
       , ( SELECT B.XREF_NBR
           FROM GHMTUO#1.TPPPRFL B
           WHERE B.PARTIC_PRFL_TCD = '04' --AIRFI
             AND B.CLT_ID = A.CLT_ID
             AND B.BUS_PGM_ID = A.PGM_ID
             AND B.CLT_ID_TCD = '01'
             AND B.PARTIC_PRFL_EDT = (SELECT MAX(X.PARTIC_PRFL_EDT)
                                      FROM GHMTUO#1.TPPPRFL X
                                      WHERE X.CLT_ID = B.CLT_ID)
             AND B.PARTIC_PRFL_CDTTM = (SELECT MAX(Z.PARTIC_PRFL_CDTTM)
                                        FROM GHMTUO#1.TPPPRFL Z
                                        WHERE Z.CLT_ID = B.CLT_ID)
          ) AS AIRFI_TCD
  FROM RAMTUO#1.TSUMM A
  WHERE A.PGM_ID = 'RT'
  GROUP BY A.CLT_ID, A.PGM_ID, A.PGM_ACCT_SQNBR
  HAVING COUNT(AIRFI_TCD) > 1
  WITH UR;

Спасибо!

Ответы [ 3 ]

0 голосов
/ 23 октября 2019

Если вам нужно просто существование, попробуйте это:

  SELECT RIGHT(DIGITS (A.CLT_ID),9) ||  A.PGM_ID ||
         RIGHT(DIGITS (A.PGM_ACCT_SQNBR),4) AS BN
  FROM RAMTUO#1.TSUMM A
  WHERE A.PGM_ID = 'RT'
  AND EXISTS 
        (
           SELECT 1
           FROM GHMTUO#1.TPPPRFL B
           JOIN 
           (
             SELECT CL
               T_ID
             , MAX(PARTIC_PRFL_EDT) PARTIC_PRFL_EDT
             , MAX(PARTIC_PRFL_CDTTM) PARTIC_PRFL_CDTTM
             FROM GHMTUO#1.TPPPRFL
             GROUP BY CLT_ID
           ) X ON X.CLT_ID = B.CLT_ID 
              AND X.PARTIC_PRFL_EDT = B.PARTIC_PRFL_EDT
              AND X.PARTIC_PRFL_CDTTM = B.PARTIC_PRFL_CDTTM
           WHERE B.PARTIC_PRFL_TCD = '04' --AIRFI
             AND B.CLT_ID = A.CLT_ID
             AND B.BUS_PGM_ID = A.PGM_ID
             AND B.CLT_ID_TCD = '01'
        )
  ; 
0 голосов
/ 23 октября 2019

Одна вещь, которая мне особенно нравится в DB2, - это возможность перемещать сложные выражения или даже подзапросы в новые поля виртуальных данных благодаря JOIN TABLE (...), что-то вроде этого:

      SELECT RIGHT(DIGITS (A.CLT_ID),9) ||  A.PGM_ID ||
         RIGHT(DIGITS (A.PGM_ACCT_SQNBR),4) AS BN
       , subq.AIRFI_TCD
  FROM RAMTUO#1.TSUMM A
    INNER JOIN TABLE
       ( SELECT B.XREF_NBR,
                COUNT(*)OVER() AS total_amount --number of matching entries
           FROM GHMTUO#1.TPPPRFL B
           WHERE B.PARTIC_PRFL_TCD = '04' --AIRFI
             AND B.CLT_ID = A.CLT_ID
             AND B.BUS_PGM_ID = A.PGM_ID
             AND B.CLT_ID_TCD = '01'
             AND B.PARTIC_PRFL_EDT = (SELECT MAX(X.PARTIC_PRFL_EDT)
                                      FROM GHMTUO#1.TPPPRFL X
                                      WHERE X.CLT_ID = B.CLT_ID)
             AND B.PARTIC_PRFL_CDTTM = (SELECT MAX(Z.PARTIC_PRFL_CDTTM)
                                        FROM GHMTUO#1.TPPPRFL Z
                                        WHERE Z.CLT_ID = B.CLT_ID)
          ) AS subq (AIRFI_TCD, total_amount) ON subq.total_amount = 1 --instead of HAVING
  WHERE A.PGM_ID = 'RT'
  WITH UR;

Попробуйте, Надеюсь это работает.

0 голосов
/ 22 октября 2019

Это решение INNER JOIN?

SELECT RIGHT(DIGITS (A.CLT_ID),9) ||  A.PGM_ID ||
         RIGHT(DIGITS (A.PGM_ACCT_SQNBR),4) AS BN,
       B.XREF_NBR AS AIRFI_TCD
FROM RAMTUO#1.TSUMM A INNER JOIN GHMTUO#1.TPPPRFL B ON B.CLT_ID = A.CLT_ID AND B.BUS_PGM_ID = A.PGM_ID
WHERE A.PGM_ID = 'RT' AND B.PARTIC_PRFL_TCD = '04'
   AND ...
GROUP BY A.CLT_ID, A.PGM_ID, A.PGM_ACCT_SQNBR

строки появятся, только если есть соответствующий CLT_ID и соответствующий PGM_ID

...