Я хочу выполнить полное внешнее соединение, чтобы получить следующие результаты. В основном я присоединяю таблицу 1 к таблице 2.
Однако в таблице 1 все, что имеет 0 в столбце A, но имеет такое же доступное значение в столбце Key 1 (значение ABC100 Key 1 в таблице 1), использовать только эту запись (запись 1 в таблице 1) и игнорировать запись 0 ( запись 2 в таблице 1)
При присоединении к таблице 2, специально для ABC100, я ожидаю увидеть выходные строки 1 и 2 в ожидаемых результатах таблицы.
Любая помощь или идеи по этому поводу?
Пример:
Таблица 1
| Key 1 | Column A |
| ABC100 | 100 |
| ABC100 | 0 |
| ABC300 | 200 |
| ABC400 | 300 |
Таблица 2
| Key 2 | Column C |
| ABC100 | 100 |
| ABC200 | 50 |
| ABC300 | 200 |
Ожидаемые результаты:
| Key 1 | Column A | Key 2 | Column B | NVL(A,0) - NVL(B,0)
| ABC100 | 100 | ABC100 | 100 | 0
| ABC100 | NULL | NULL | NULL | NULL
| NULL | NULL | ABC200 | 50 | -50
| ABC300 | 200 | ABC300 | 200 | 0
| ABC400 | 300 | NULL | NULL | 300
Похоже, вам может понадобиться полное внешнее соединение. Но имейте в виду, что использование полного внешнего соединения часто может означать, что ваша модель данных спланирована неправильно.
@TimBiegeleisen Я думал, что это возможный подход. Причина, по которой я выполняю этот тип соединения, заключается в том, что на самом деле моя таблица 1 - это одна система учета, а таблица 2 - другая система учета, и конечная цель - создать тип согласования набора результатов.


Вы можете использовать:
SELECT t1.*, t2.*, NVL(t1.A,0) - NVL(t2.B,0)
FROM tab1 t1
FULL JOIN tab2 t2
ON t1.Key1=t2.Key2
Ваш набор результатов предполагает, что вы хотите что-то вроде этого:
SELECT t1.key1,
(CASE WHEN t1.a <> 0 THEN t1.a END) as a,
(CASE WHEN t1.a <> 0 THEN t2.key2 END) as key2,
(CASE WHEN t1.a <> 0 THEN t2.c END) as ,
(CASE WHEN t1.a <> 0 THEN COALESCE(t1.A, 0) - COALESCE(t2.B, 0) END) as diff
FROM t1 FULL JOIN
t2
ON t1.Key1 = t2.Key2;
Ваше описание предполагает, что вы хотите:
SELECT t1.key1, t1.a, t2.key2, t2.c,
COALESCE(t1.A, 0) - COALESCE(t2.B, 0) as diff
FROM (SELECT t1.*
FROM
WHERE t1.A <> 0 OR
NOT EXISTS (SELECT 1 FROM t1 tt1 WHERE tt1.key1 = t1.key1 AND tt1.key1 <> 0)
) t1 FULL JOIN
t2
ON t1.Key1 = t2.Key2;
Почему «ABC100» дважды появляется в результирующем наборе, если вы хотите его игнорировать?