合并来自2个表的数据,仅使用唯一行

时间:2014-02-20 08:09:39

标签: mysql sql

我的数据库中有2个表

primary_id
primary_date
primary_measuredData 

temporary_id
temporary_date
temporary_measuredData

好。该表有其他列,但这些是重要的列。

我想要的是以下内容。

表“primary”由经过验证的measuredData组成。如果此处有数据,则输出应首先从primary选择,如果在primary中不可用,则从临时选择。

在大约99.99%的案例中,所有旧数据都在主要数据中,并且只有最后一天来自临时表。

示例:

primary table:
2013-02-05; 345
2013-02-07; 123
2013-02-08; 3425
2013-02-09; 334

temporary table:
2013-02-06; 567
2013-02-07; 1345
2013-02-10; 31
2013-02-12; 33

我正在寻找输出的SQL查询:

2013-02-05; 345   (from primary)
2013-02-06; 567   (from temporary, no value available from prim)
2013-02-07; 123   (from primary, both prim & temp have this date so primary is used)
2013-02-08; 3425  (primary)
2013-02-09; 334   (primary)
2013-02-10; 31    (temp)
2013-02-12; 33    (temp)

你看,没有重复的日期,如果数据在主表上是可用的,那么数据就是从那个数据中使用的。

我不知道如何解决这个问题,所以我不能给你任何“这是我到目前为止所做的:D”

谢谢!

修改 “measuredData”的值可以与temp和primary不同。这是因为temp用于存储临时值,稍后在验证数据时,它会进入主表。

编辑2: 我更改了主表并添加了一个新列“临时”。这样我就可以将所有数据存储在同一个表中。更新主数据时,它会使用新数字更新临时数据。这样我就不需要将两个表合并为一个。

1 个答案:

答案 0 :(得分:1)

你应该从这样的UNION QUERY开始:

SELECT p.primary_date AS dt, p.primary_measuredData as measured
FROM
  `primary` p
UNION ALL
SELECT t.temporary_date, t.temporary_measuredData
FROM
  `temporary` t  LEFT JOIN `primary` p
  ON p.primary_date=t.temporary_date
WHERE p.primary_date IS NULL

LEFT JOIN,其中没有匹配项(p.primary_date IS NULL)将返回临时表中主表中不存在的所有行。使用UNION ALL,您可以返回第一个表中可用的所有行。

您可能希望在整个查询中添加ORDER BY子句。请参阅小提琴here