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