Oracle-Join с одной и той же таблицей несколько раз с разными условиями где - PullRequest
0 голосов
/ 01 ноября 2018

Вот мой случай,

enter image description here

SELECT 
A.TAB1_COL1,B.TAB2_COL4,C.TAB2_COL4 
FROM TABLE1 A, 
LEFT OUTER JOIN 
    (SELECT * FROM 
        (SELECT TAB2_COL1, TAB2_COL2, TAB2_COL4, ROW_NUMBER() OVER (PARTITION BY TAB2_COL1,TAB2_COL2 ORDER BY TAB2_COL3 DESC ) AS ROW_NUM 
            FROM TABLE2 
            WHERE TAB2_COL2=2
        ) WHERE ROW_NUM=1
    ) B ON A.TAB1_COL1=B.TAB2_COL1 
LEFT OUTER JOIN 
    (SELECT * FROM 
        (SELECT TAB2_COL1, TAB2_COL2, TAB2_COL4, ROW_NUMBER() OVER (PARTITION BY TAB2_COL1,TAB2_COL2 ORDER BY TAB2_COL3 DESC ) AS ROW_NUM 
            FROM TABLE2 WHERE TAB2_COL2=5
        ) WHERE ROW_NUM=1
    ) C ON A.TAB1_COL1=C.TAB2_COL1 AND A.TAB1_COL2=C.TAB2.COL5 
LEFT OUTER JOIN 
    (SELECT * FROM 
        (SELECT TAB2_COL1, TAB2_COL2, TAB2_COL4, ROW_NUMBER() OVER (PARTITION BY TAB2_COL1,TAB2_COL2 ORDER BY TAB2_COL3 DESC ) AS ROW_NUM 
            FROM TABLE2 WHERE TAB2_COL2=8
        ) WHERE ROW_NUM=1
    ) D ON A.TAB1_COL1=D.TAB2_COL1

Этот код будет работать. Но мне осталось присоединиться к одной и той же таблице несколько раз. В моем случае это было около 25 раз. Справочная таблица насчитывает около 200 миллионов записей. Перегородка для удаления дупла занимает много времени.

Любой другой эффективный способ написания, чтобы ускорить процесс. Пожалуйста, помогите.

Спасибо

1 Ответ

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

Если я правильно понимаю, вы можете использовать условное агрегирование:

select t1.tab1_col1,
       max(case when tab2_col2 = 2 then tab2_col4 end),
       max(case when tab2_col2 = 5 then tab2_col4 end),
       max(case when tab2_col2 = 8 then tab2_col4 end)
from table1 t1 left join
     (select t2.*,
             row_number() over (partition by tab2_col1, tab2_col2 order by tab2_col3 desc) as seqnum
      from table2 t2
     ) t2
     on t1.tab1_col1 = t2.tab2_col1
group by t1.tab1_col1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...