2016-12-13 32 views
0

我遇到了一個問題,即在完全不同的服務器中找到有關客戶的不同信息。結合MySQL中的表來替換行值匹配時的NULL值

到目前爲止,我的解決方案是從每臺服務器獲取必要的組件,並將它們組合到MySQL中。

我的問題: 我正在尋找替換從MySQL的一個表中的NULL值與來自另一個表的信息,當第一個表中的NULL,提供其他列匹配。

當列在OrderName列中顯示爲NULL且在原始表的Order_ID列中顯示爲-1時,信息將僅顯示在第二個表中。這第二個表格將包含缺少的信息,並與其他列(如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中做的嗎?

如果是這樣,任何指導如何實現這一點將不勝感激。

感謝您的幫助。

+0

PLZ刪除不需要的標籤,如'SQL-server' –

+0

爲什麼你有兩個如此相似的表?你不能在table1中存儲所有的數據並且丟棄table2嗎? – jarlh

回答

0

您正在尋找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; 
+0

'COALESCE()'不適用於'order_id'列。 – sagi

+0

@sagi。 。 。 'COALESCE()'可以正常工作。問題在於「ON」子句條款中;現在有適當的比較是爲了表格之間的匹配。 'NULL'來自'LEFT JOIN'不匹配。 –

+0

哦,是的,我明白你現在在做什麼:) – sagi

0

使用CASE EXPRESSIONLEFT 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) 
0

留下CASE條件可以得到你需要的數據JOIN。

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;