Oracle 18 c - Условное предложение USING для левого соединения - PullRequest
0 голосов
/ 13 января 2020

У меня есть курсор с левым соединением, например, так:

CURSOR c_emp
    SELECT * FROM FROM EMP_NEW
    LEFT JOIN
    (SELECT EMP_ID,
            DEPT_ID,
            SUB_DEPT_ID,
            EMP_UID,
       FROM EMP)
       USING (DEPT_ID, SUB_DEPT_ID, EMP_UID);

Который затем указывается в a для l oop:

For i in c_emp
IF i.emp_id IS NULL
then
    insert into emp...
else
    update emp...
    where emp_id = i.emp_id;
end if;

У нас есть сценарий при загрузке новые данные в таблицу EMP из таблицы EMP_NEW, emp_new.dept_id и emp_new.emp_uid могут иметь дубликат в таблице EMP с другим значением sub_dept_id. Когда мы получаем такие новые данные, emp.emp_id не выбирается в курсоре, таким образом, logi c переходит в INSERT вместо UPDATE. Я хотел бы, чтобы дубликат emp_id был выбран таким образом, чтобы он перешел к UPDATE.

EMP-данным:

EMP_ID     DEPT_ID     SUB_DEPT_ID      EMP_UID
123        1           10               123.123

EMP_NEW данным:

DEPT_ID      SUB_DEPT_ID     EMP_UID
1            20              123.123

Указанный выше курсор в настоящее время возвращает следующее:

EMP_ID     DEPT_ID     SUB_DEPT_ID      EMP_UID
null       1           20               123.123

Что я хотел бы вернуть:

EMP_ID     DEPT_ID     SUB_DEPT_ID      EMP_UID
123        1           20               123.123

1 Ответ

0 голосов
/ 13 января 2020

Вы, кажется, хотите сначала сопоставить 3 столбца, а если не только два столбца. Я думаю, что боковое соединение лучше соответствует вашим потребностям:

SELECT en.*, e.*
FROM EMP_NEW en LEFT JOIN LATERAL
     (SELECT EMP_ID
      FROM EMP e
      WHERE en.DEPT_ID = e.DEPT_ID AND en.EMP_UID = e.EMP_UID
      ORDER BY (CASE WHEN en.SUB_DEPT_ID = e.SUB_DEPT_ID THEN 1 ELSE 2 END)
      FETCH FIRST 1 ROW ONLY  -- presumably you want only one row either way
     ) e
...