MySQL:在没有 JOIN 或 UNION 的情况下合并两个不同的表

Posted

技术标签:

【中文标题】MySQL:在没有 JOIN 或 UNION 的情况下合并两个不同的表【英文标题】:MySQL: Merge two different tables without JOIN or 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:不,我自己没有找到更好的解决方案,请参见下面给出的答案。 【参考方案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

【讨论】:

以上是关于MySQL:在没有 JOIN 或 UNION 的情况下合并两个不同的表的主要内容,如果未能解决你的问题,请参考以下文章

mysql中left join和union有啥区别?

mysql join与union查询

MySQL JOIN 的结果 UNION

MySQL JOIN / UNION DISTINCT 问题

强制 MySQL 从 WHERE IN 子句返回重复项而不使用 JOIN/UNION?

Mysql union/join 对多列的帮助