Условное внутреннее соединение и CASE - PullRequest
0 голосов
/ 09 апреля 2020

Использование Oracle. У меня есть таблица, которая выглядит следующим образом:

  COLUMN1  COLUMN2
1 A1       B1
2 A2       B2
3          B3
4 A3
5          B4
6          B5
7 A4       B6

Я использую COLUMN1 в качестве первичного ключа для сопоставления с другой таблицей. Однако некоторые строки для COLUMN1 пусты, и в этих случаях мне рекомендуется использовать значения COLUMN2 в качестве первичных ключей (например, строки 5 и 6).

1) Можно ли написать условный INNER ПРИСОЕДИНИТЬСЯ к заявлению с CASE? Что-то вроде

CASE WHEN
COLUMN1 IS NULL 
THEN INNER JOIN ...... ON column1 = ....
ELSE
INNER JOIN ...... ON column2 = ....
END (???)

2) Другой вариант, который мне предложили мои друзья, - это создать новый столбец со значениями строки, в основном из COLUMN1 и, во вторую очередь, из COLUMN2, если COLUMN1 пуст для этой строки. Как бы я сделал это с NVL и CASE? Желаемый результат будет следующим, и NEW_COLUMN будет моим основным ключом для сопоставления:

  NEW_COLUMN
1 A1       
2 A2       
3 B3
4 A3
5 B4
6 B5
7 A4

Ответы [ 2 ]

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

Столбец первичного ключа НЕ может иметь повторяющиеся значения. В принципе, столбец первичного ключа является уникальным идентификатором строки, и поэтому в нем могут отсутствовать значения NULL. Проекту может потребоваться объединение другим способом.

Сказав это, условное СОЕДИНЕНИЕ, использующее несколько столбцов, будет выглядеть следующим образом

Select ColA, ColB, ColC
From Table1 T1
Join Table2 T2
    On NVL (T1.Col1, T1.Col2) = NVL (T2.Col01, T2.Col02)

Вы также можете создать новый столбец, подобный этому

Alter Table1 Add Col3  NUMBER GENERATED ALWAYS AS NVL (Col1, Col2) STORED;
1 голос
/ 09 апреля 2020

CASE - это выражение, подобное +. Это не контролирует код. Вы можете использовать следующее:

select . . .
from table1 t1 join
     table2 t2
     on t2.col = coalesce(t1.col1, t1.col2)

Часто две left join имеют лучшую производительность:

select . . .,
       coalesce(t21.colx, t22.colx) as colx
from table1 t1 join
     table2 t21
     on t21.col = t1.col1 left join
     table2 t22
     on t22.col = t1.col2 and t1.col1 is null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...