Oracle JOIN в курсоре, только если для входного параметра найдены определенные метаданные - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть курсор с объединением, например:

CURSOR C1 IS
SELECT *
        FROM table_1 a
             JOIN table_2 b
                                ON b.ID_1 = a.ID_1
       WHERE     TABLE_ID IS NOT NULL
             AND TABLE_ID = p_input_id; 

Я хочу изменить курсор и добавить еще 3 объединения, только если p_input_id IS найден в таблице метаданных. Итак, я хочу сделать что-то вроде этого:

CURSOR C1 IS
SELECT *
        FROM table_1 a
             JOIN table_2 b
                                ON b.ID_1 = a.ID_1
             CASE 
                 WHEN EXISTS (SELECT 1 
                              FROM METADATA_TABLE 
                              WHERE INPUT_ID = p_input_id 
                              AND FLAG = 'Y') 
                 THEN 
                     JOIN table_3 c
                                        ON c.ID_2 = b.ID_2
                     JOIN table_4 d
                                        ON d.ID_3 = c.ID_3
             END
       WHERE     TABLE_ID IS NOT NULL
             AND TABLE_ID = p_input_id; 

Как я могу выполнить sh это? Я мог бы рассмотреть возможность использования LEFT JOIN вместо case / join. Есть ли какие-либо проблемы с этим?

CURSOR C1 IS
SELECT *
        FROM table_1 a
             JOIN table_2 b
                                ON b.ID_1 = a.ID_1
             LEFT JOIN table_3 c
                                ON c.ID_2 = b.ID_2
             LEFT JOIN table_4 d
                                ON d.ID_3 = c.ID_3
       WHERE     TABLE_ID IS NOT NULL
             AND TABLE_ID = p_input_id; 

Я стараюсь не ломать текущий курсор для p_input_id, которые его используют. Появятся новые p_input_id, которые должны использовать дополнительные объединения таблиц.

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете использовать LEFT JOIN для table_3 и table_4 и count в таблице metadata следующим образом:

SELECT * FROM TABLE_1 A
    JOIN TABLE_2 B ON B.ID_1 = A.ID_1
    JOIN ( SELECT COUNT(1) AS CNT
             FROM METADATA_TABLE
            WHERE INPUT_ID = P_INPUT_ID
              AND FLAG = 'Y') MT
    LEFT JOIN TABLE_3 C ON C.ID_2 = B.ID_2
                           AND MT.CNT > 0
    JOIN TABLE_4 D ON D.ID_3 = C.ID_3
                      AND MT.CNT > 0
WHERE TABLE_ID IS NOT NULL
  AND TABLE_ID = P_INPUT_ID;

COUNT используется в таблице metadata для убедитесь, что он возвращает только одну запись. (замена exists)

...