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

标签 mysql sql

我的数据库中有 2 个表

primary_id
primary_date
primary_measuredData 

temporary_id
temporary_date
temporary_measuredData

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

我想要的是以下内容。

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

在大约 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: 我更改了主表并添加了一个新列“临时”。这样我就可以将所有数据存储在同一个表中。更新主要数据时,它会使用新数字更新临时数据。这样我就不需要将 2 个表合并为一个。

最佳答案

你应该从这样的 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 子句添加到整个查询。请看 fiddle here .

关于mysql - 合并来自 2 个表的数据,仅使用唯一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21901787/

相关文章:

php - 我的日期未以日期时间格式正确保存到 MySQL

mysql - 根据 IN 条件应用 mysql 限制

mysql - 如何从MySQL中非表格式的表中返回数据?

sql - 在具有日期限制的 SQL 记录中搜索

sql - Oracle 中的 DATEDIFF 函数

mysql - 用于选择日期之间数据的 SQL 查询不显示最后日期

php - Laravel:在 DB::raw() 中使用别名时未知列

php - Mysql正则表达式防止字符为数字

mysql - 按条件将多行数据转为单行

c# - 检查 BIT 列时从 LINQ 生成的奇怪 SQL