Как получить количество записей, используя разбиение в Oracle - PullRequest
0 голосов
/ 12 ноября 2018

У меня следующий запрос:

SELECT 
    F.IID, 
    F.E_NUM AS M_E_NUM, 
    MCI.E_NUM AS MCI_E_NUM, 
    F.C_NUM AS M_C_NUM, 
    MCI.C_NUM AS MCI_C_NUM,
    F.ET_ID AS M_ET_ID, 
    EDIE.ET_ID AS ED_INDV_ET_ID,
    COUNT(*) OVER (PARTITION BY F.IID) IID_COUNT
FROM FT_T F JOIN CEMEI_T MCI ON F.IID = MCI.IID
    JOIN EDE_T EDE ON MCI.E_NUM = EDE.E_NUM
    JOIN EDIE_T EDIE ON EDIE.IID = F.IID AND EDIE.ET_ID = EDE.ET_ID
WHERE 
    F.DEL_F = 'N'
    AND MCI.EFF_END_DT IS NULL
    AND MCI.TOS = 'BVVB'
    AND EDE.PTEND_DT IS NULL
    AND EDE.DEL_S = 'N'
    AND EDE.CUR_IND = 'A'
    AND EDIE.TAR_N = 'Y'
    AND F.IID IN
        (
         SELECT DISTINCT IID 
         FROM FT_T 
         WHERE GROUP_ID = 'BG' 
            AND DEL_F = 'N' 
            AND (IID, E_NUM) NOT IN 
                (
                 SELECT IID, E_NUM FROM CEMEI_T 
                 WHERE TOS = 'BVVB' AND EFF_END_DT IS NULL
                )
        );

Я в основном собираю информацию из нескольких таблиц и создаю единую запись о них.

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

Я пытался использовать разбиение, но все строки в результирующем наборе возвращают один счет, хотя есть и те, которые имеют 2 записи с одинаковыми IID в FT_T.

Причина, по которой я первоначально сказал, что я собираю информацию из нескольких таблиц, заключается в том, что FT_T может не иметь всей необходимой мне информации, если две записи не доступны для одного и того же IID, поэтому я имею чтобы получить их из других таблиц JOIN ed в запросе. Однако мне нужно знать, какие FT_T.IID имеют две записи в FT_T (или больше, чем одна).

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

это просто комментарий / наблюдение, но необходимо форматирование

Использование in(...) с select distinct и not in(...,...) кажется сложным и может стать проблемой, если некоторые значения равны NULL.Я предлагаю вам рассмотреть возможность использования EXISTS, а не EXISTS.например,

AND EXISTS (
    SELECT
        NULL
    FROM FT_T
    WHERE F.IID = FT_T.IID
    AND FT_T.GROUP_ID = 'BG'
    AND FT_T.DEL_F = 'N'
    AND NOT EXISTS (
        SELECT
            NULL
        FROM CEMEI_T
        WHERE FT_T.IID = CEMEI_T.IID
        AND FT_T.E_NUM = CEMEI_T.E_NUM
        AND CEMEI_T.TOS = 'BVVB'
        AND CEMEI_T.EFF_END_DT IS NULL
    )
)
0 голосов
/ 12 ноября 2018

Возможно, вам нужно рассчитать счет до join и фильтрации:

SELECT . . .
FROM (SELECT F.*,
             COUNT(*) OVER (PARTITION BY F.IID) as IID_CNT
      FROM FT_T F
     ) JOIN
     CEMEI_T MCI
     ON F.IID = MCI.IID JOIN
     EDE_T EDE
     ON MCI.E_NUM = EDE.E_NUM JOIN
     EDIE_T EDIE
     ON EDIE.IID = F.IID AND EDIE.ET_ID = EDE.ET_ID
 . . .
...