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
因为它只会返回table1
和table2
之间的交集,
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 JOIN / UNION DISTINCT 问题