Объединение таблиц в MySQL для замены значений NULL при совпадении строк

У меня проблема, когда разная информация о клиентах находится на совершенно разных серверах.

Мое решение пока состоит в том, чтобы взять необходимые части с каждого сервера и объединить их в MySQL.

Моя проблема: я хочу заменить значения NULL из одной таблицы в MySQL информацией из другой таблицы, когда NULL в первой таблице, при условии совпадения других столбцов.

Информация будет отображаться во второй таблице только тогда, когда столбцы отображаются как NULL в столбце OrderName и -1 в столбце Order_ID из исходной таблицы. Эта вторая таблица будет содержать недостающую информацию и будет выровнена с другими столбцами, такими как Cust_ID и DateTime.

E.g.

Таблица 1:

Cust_ID    |   Order_ID    |    OrderName    |    DateTime    |    Other_Info
------------------------------------------------------------------------------
12345      |      -1       |      NULL       |   2016/01/01   |      Info1
12345      |     1254      |     Orange      |   2016/02/03   |      Info2
54321      |     5412      |     Apple       |   2016/04/15   |      Info3
45899      |      -1       |      NULL       |   2016/06/08   |      Info4 

Таблица 2:

Cust_ID    |    OrderID    |    OrderName    |    DateTime
-------------------------------------------------------------
12345      |     1549      |     Banana      |   2016/01/01
45899      |     5862      |     Grape       |   2016/06/08

Желаемый результат:

Cust_ID    |   Order_ID    |    OrderName    |    DateTime    |    Other_Info
------------------------------------------------------------------------------
12345      |     1549      |     Banana      |   2016/01/01   |      Info1
12345      |     1254      |     Orange      |   2016/02/03   |      Info2
54321      |     5412      |     Apple       |   2016/04/15   |      Info3
45899      |     5862      |     Grape       |   2016/06/08   |      Info4 

Я пробовал использовать предложения CASE WHEN в сочетании с функцией COALESCE, чтобы добиться этого, но пока безуспешно.

Можно ли это сделать в MySQL?

Если это так, мы будем очень признательны за любые рекомендации о том, как этого добиться.

Спасибо за вашу помощь.


person Bob    schedule 13.12.2016    source источник
comment
пожалуйста, удалите ненужные теги, например sql-server   -  person ahmed abdelqader    schedule 13.12.2016
comment
Почему у вас две такие похожие таблицы? Разве вы не можете сохранить все данные в table1 и отбросить table2?   -  person jarlh    schedule 13.12.2016


Ответы (3)


Используйте CASE EXPRESSION с LEFT JOIN:

SELECT t1.cust_id,
       CASE WHEN t1.order_id = -1 THEN t2.orderid else t1.order_id END as order_id,
       CASE WHEN t1.orderName IS NULL THEN t2.orderName else t1.orderName END as order_Name,
       t1.dateTime,
       t1.other_info
FROM Table1 t
LEFT JOIN Table2 s
 ON(t.cust_id = s.cust_id)
person sagi    schedule 13.12.2016

LEFT JOIN с условием CASE может получить необходимые данные.

 SELECT T1.CUST_ID,
    CASE WHEN T1.ORDER_NAME IS NULL THEN T2.ORDER_ID ELSE T1.ORDER_ID END, 
    CASE WHEN T1.ORDER_NAME IS NULL THEN T2.ORDER_NAME ELSE T1.ORDER_NAME END, 
    T1._DATE_TIME,
    T1.OTHER_INFO
    FROM
    TABLE1 T1
    LEFT JOIN TABLE2 T2
    ON T1.CUST_ID = T2.CUST_ID;
person knkarthick24    schedule 13.12.2016

Вы ищете left join:

select t1.cust_id, coalesce(t2.orderid, t1.order_id) as order_id,
       coalesce(t2.order_name, t1.order_name) as order_name,
       t1.datetime, t1.other_info
from table1 t1 left join
     table2 t2
     on t1.cust_id = t2.cust_id and
        t1.datetime = t2.datetime and
        t1.order_id = -1;
person Gordon Linoff    schedule 13.12.2016
comment
@sagi. . . COALESCE() будет работать нормально. Проблема заключалась в предложении ON; теперь есть правильное сравнение для сопоставления между таблицами. NULL происходит от LEFT JOIN, не совпадающего. - person Gordon Linoff; 13.12.2016
comment
О да, я вижу, что ты сейчас делал :) - person sagi; 13.12.2016