Свернуть строки только в том случае, если данные совпадают или одна из них имеет значение NULL в SQL.

Я хотел бы объединить таблицы, только если все столбцы совпадают или если несоответствующие столбцы связаны с NULL

Например, если я хочу присоединиться к таблице t1, это выглядит так:

 id | column1 | column2 | column3
----+---------+---------+---------
  A |  NULL   |    1    |   NULL
  B |  NULL   |    3    |    v5
  C |   v6    |   NULL  |   NULL

Для таблицы t2 это выглядит так:

 id | column1 | column2 | column3
----+---------+---------+---------
  A |   v1    |    1    |    v2   
  A |  NULL   |    2    |    v3
  B |   v4    |   NULL  |   NULL
  C |   v7    |    4    |    v8

Я хотел бы, чтобы результирующая целевая таблица была:

 id | column1 | column2 | column3
----+---------+---------+---------
  A |   v1    |    1    |    v2   
  A |  NULL   |    2    |    v3
  B |   v4    |    3    |    v5
  C |   v6    |   NULL  |   NULL
  C |   v7    |    4    |    v8

Где row1 в t1 и row1 в t2 объединяются, а row2 в t1 и row3 в t2 объединяются, сохраняя при этом другие строки в t1 и t2 без совпадений.

Будет ли это каким-то образом достижимо с помощью COALESCE и FULL JOIN или любых других методов?


person Ik-Hwan Kim    schedule 16.08.2018    source источник


Ответы (2)


Хм . . . Если я правильно понимаю, вы хотите рассматривать NULL как подстановочный знак, когда выполняете JOIN. Таким образом, NULL в любой таблице будет соответствовать любому значению в другой таблице.

Если это так, то FULL JOIN во всех столбцах (с правильной логикой) должен делать то, что вы хотите:

select t1.id,
       coalesce(t2.col1, t1.col1) as col1,
       coalesce(t2.col2, t1.col2) as col2,
       coalesce(t2.col3, t1.col3) as col3
from t1 full join
     t2
     on t1.id = t2.id and
        (t1.col1 = t2.col1 or t1.col1 is null or t2.col1 is null) and
        (t1.col2 = t2.col2 or t1.col2 is null or t2.col2 is null) and
        (t1.col3 = t2.col3 or t1.col4 is null or t2.col3 is null);
person Gordon Linoff    schedule 16.08.2018

Попробуйте это с полным внешним соединением и COALESCE

select table1.id,COALESCE(table1.column1, table2.column1) as column1,
COALESCE(table1.column2, table2.column2) as column2,
COALESCE(table1.column3, table2.column3) as column3 from table1 
full outer join table2 on table1.id=table2.id
person Fahmi    schedule 16.08.2018