MySQL将两个表合并为不同的数据

时间:2015-02-24 10:06:57

标签: mysql join merge

以下是我的mysql表

表1:

ID  | commonID | Date  | text | active
1     11         01.02   abc    1
2     11         02.02   123    1 
3     11         03.02   xyz    0

表2:

ID  | commonID | Date  | value | active
1     11         01.02   abc    1
2     11         04.02   123    1 
3     11         03.02   xyz    1

最终结果应显示:

| date | text |   value
  01.02  abc      abc
  02.02  123      (null)
  03.02  (null)   xyz
  04.02  (null)   123

这里的想法是合并两个表。将从两个表中选择示例中具有已定义的commonID​​(例如11)的所有条目。表格将统一起来。 条件:

如果 TABLE1 TABLE2 中有匹配日期,则会合并 如果 TABLE1 TABLE2 中有个人日期,则没有日期的表的值/文本将变为NULL 如果 TABLE1 TABLE2 中的记录 active = FALSE ,则不会处理该记录。 BOTH表中可以有匹配和不匹配的日期。

我想用它来显示时间顺序事件,如果两个表中都有一个事件,那么应该只有一行。

这里的解决方案是什么?

3 个答案:

答案 0 :(得分:1)

试试这个:

SELECT T1.date,
       CASE WHEN T1.active = 1 THEN T1.text END as text,
       CASE WHEN T2.active =1 THEN T2.value END as value
FROM Table1 T1 LEFT JOIN
     Table2 T2 ON T1.date=T2.date
UNION
SELECT T2.date,
       CASE WHEN T1.active = 1 THEN T1.text END as test,
       CASE WHEN T2.active = 1 THEN T2.value END as value
FROM Table1 T1 RIGHT JOIN
     Table2 T2 ON T1.date=T2.date

结果:

DATE    TEXT    VALUE
01.02   abc     abc
02.02   123     (null)
03.02   (null)  xyz
04.02   (null)  123

示例SQL Fiddle

答案 1 :(得分:0)

试试这个:

SELECT t1.date,t1.text,t2.value FROM table1 t1
LEFT JOIN table2 t2 ON t1.commonId = t2.commonId and t1.date = t2.date and t2.active = 1
where t1.active = 1
UNION
SELECT t2.date,t1.text,t2.value FROM table2 t2
LEFT JOIN table1 t1 ON t1.commonId = t2.commonId and t1.date = t2.date and t1.active = 1
where t2.active = 1

示例http://sqlfiddle.com/#!2/d2c4d/2

答案 2 :(得分:0)

这是单程......

SELECT commonid
     , date
     , MAX(text) text
     , MAX(value) value
  FROM 
     ( SELECT id
            , commonid
            , date
            , text
            , NULL value
            , active
         FROM table1
        WHERE active <> 0

        UNION

       SELECT id
            , commonid
            , date
            , NULL
            , value
            , active
         FROM table2
        WHERE active <> 0
     ) x
 GROUP
    BY commonid,date;

如果您愿意,可以将WHERE active <> 0位移出UNION,直到GROUP BY之前。