Oracle SQL - как объединить две таблицы, одну ко многим?

Я хочу выполнить полное внешнее соединение, чтобы получить следующие результаты. В основном я присоединяю таблицу 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

Почему «ABC100» дважды появляется в результирующем наборе, если вы хотите его игнорировать?

Gordon Linoff 16.09.2018 16:32

Похоже, вам может понадобиться полное внешнее соединение. Но имейте в виду, что использование полного внешнего соединения часто может означать, что ваша модель данных спланирована неправильно.

Tim Biegeleisen 16.09.2018 16:33

@TimBiegeleisen Я думал, что это возможный подход. Причина, по которой я выполняю этот тип соединения, заключается в том, что на самом деле моя таблица 1 - это одна система учета, а таблица 2 - другая система учета, и конечная цель - создать тип согласования набора результатов.

user1683776 16.09.2018 17:02
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
43
2

Ответы 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;

Другие вопросы по теме