【问题标题】:MySQL: Merge two different tables without JOIN or UNIONMySQL:在没有 JOIN 或 UNION 的情况下合并两个不同的表
【发布时间】:2011-12-21 23:11:49
【问题描述】:

我需要合并两个表:

  • 两者都有一个主键列日期,但具有不同的值(不同的时间间隔)。
  • 两者都有不同的(未知)列:我不知道列的名称(两个表中可能出现相同的列名),我不知道有多少列,但都是相同的类型。

一个例子:

table1
date       | colA | colB | colC
2011-02-02 | 1.09 | 1.03 | 1.04

table2
date       | col1 | col2 | col3 | col4
2011-02-03 | 1.03 | 1.02 | 1.07 | 1.03

查询结果应如下所示:

tableResult
date       | colA | colB | colC | col1 | col2 | col3 | col4
2011-02-02 | 1.09 | 1.03 | 1.04 | null | null | null | null
2011-02-03 | null | null | null | 1.03 | 1.02 | 1.07 | 1.03

这不起作用:

  • INNER JOIN 因为它只会返回table1table2 之间的交集,
  • OUTER JOIN 仅从左表返回交集 + 值(如果使用右连接,则返回右表)
  • UNION 因为列数可能不同。

有什么想法吗?

克里斯托夫

【问题讨论】:

  • 我有一个解决方案,但包含多余的主键。你可以吗?
  • 如果字段“colA”在同一日期有不同的值怎么办?其中一张表应该是主表。
  • 列名是简单传感器网络中传感器的地址。因此,两个表中的相同列名表示相同的传感器。两个条目中的相似值将只是相同的值。 DISTINCT 可以帮助解决这个问题,如果我没记错的话。另一方面,两个表的日期间隔不同,它们永远不应该发生冲突(偶数值与奇数值)
  • @Christoph,您找到任何更好的解决方案请建议我...我有同样的情况...
  • @samirprogrammer:不,我自己没有找到更好的解决方案,请参见下面给出的答案。

标签: mysql join merge union


【解决方案1】:

您可以使用仅日期列的并集创建一个临时表,然后使用该临时表与其他 2 列进行左外连接。

例子:

DROP TABLE temptbl IF EXISTS;
CREATE TEMPORARY TABLE temptbl (myDate DATETIME PRIMARY KEY)
    AS (SELECT MyDate FROM table1)
    UNION (SELECT MyDate FROM table2)
    ORDER BY MyDate;
SELECT * FROM temptbl
    LEFT OUTER JOIN table1 USING (MyDate)
    LEFT OUTER JOIN table2 USING (MyDate);

【讨论】:

  • 是的,没错。这是上面代码的示例:DROP TABLE temptbl IF EXISTS; CREATE TEMPORARY TABLE temptbl (myDate DATETIME PRIMARY KEY) AS (SELECT MyDate FROM table1) UNION (SELECT MyDate FROM table2) ORDER BY MyDate; SELECT * FROM temptbl LEFT OUTER JOIN table1 USING (MyDate) LEFT OUTER JOIN table2 USING (MyDate);
【解决方案2】:
select coalesce(t2.data,'')+coalesce(t1.data,'') as data,
    t2.col1, t2.col2, t2.col3 ,t2.col4 ,t1.cola ,t1.colb, t1.colc
from table2 as t2
full outer join 
table1 t1
on t2.data = 2011-02-03
or t1.data = 2011-02-02

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 2021-11-12
    相关资源
    最近更新 更多