填写表中缺少的行

时间:2014-08-13 23:02:06

标签: mysql sql union

起初,我的问题可能看似简单,之前已被问过。忍受我 - 我认为这是一个独特的问题。

表A包含StateCountyMonthYearRate列。每个州,县综合体都列出了几次,具有不同的日期和费率。有些行设置了State和County,该行中的其他所有内容都为NULL。

表B列出了每个月和每年的默认费率。列为MonthYearRate。在这张表中,我有几年的默认数据。

因此,对于表A中的每个州,县复合,我想用表B中的数据填写任何缺失的数据。

我创建了一个类似于表A的表C,除了用表B中的默认数据填充所有数据。然后我一起尝试UNION表A和表C.但我最终遇到了两个问题。

首先,我结束了重复的行,除了速率之外,所有内容都相同。在这种情况下,我想只保留表A中最初的行(而不是'默认速率')。

第二,我最后得到的行有State和County设置,但其他一切都是NULL。我需要为每个默认速率用行替换这些行。

所以最后我希望每个州,县,月,年复合都有一行。

是否可以按照我的描述组合表格。

如果您需要澄清任何内容,请与我们联系。感谢。

表A有几千行。每个州有1到48行,县综合:

+-------+--------+-------+------+------+
| State | County | Month | Year | Rate |
+-------+--------+-------+------+------+
| NY    | Albany | 1     | 2011 | ###  |
| NY    | Albany | 2     | 2011 | ###  |
...
| NY    | Albany | 12    | 2011 | ###  |
| NY    | Albany | 1     | 2012 | ###  |
...
| NY    | Albany | 12    | 2012 | ###  |
| NY    | Monroe | 1     | 2011 | ###  |
...
| NY    | Monroe | 12    | 2011 | ###  |
| NY    | Essex  | NULL  | NULL | NULL |
+-------+--------+-------+------+------+

表B有36行。每个月超过3年的一行:

+-------+------+------+
| Month | Year | Rate |
+-------+------+------+
| 1     | 2011 | ***  |
| 2     | 2011 | ***  |
| ...   |      |      |
| 12    | 2011 | ***  |
| 1     | 2012 | ***  |
| ...   |      |      |
| 12    | 2012 | ***  |
| 1     | 2013 | ***  |
| ...   |      |      |
| 12    | 2013 | ***  |
+-------+------+------+

结果表的行数多于表A.每个州,县组合都至少有默认表中的36行:

+-------+--------+-------+------+------+
| State | County | Month | Year | Rate |
+-------+--------+-------+------+------+
| NY    | Albany |     1 | 2011 | ###  |
| ...   |        |       |      |      |
| NY    | Albany |    12 | 2011 | ###  |
| NY    | Albany |     1 | 2012 | ###  |
| ...   |        |       |      |      |
| NY    | Albany |    12 | 2012 | ###  |
| NY    | Albany |     1 | 2013 | ***  |
| ...   |        |       |      |      |
| NY    | Albany |    12 | 2013 | ***  |
| NY    | Monroe |     1 | 2011 | ###  |
| ...   |        |       |      |      |
| NY    | Monroe |    12 | 2011 | ###  |
| NY    | Monroe |     1 | 2012 | ***  |
| ...   |        |       |      |      |
| NY    | Monroe |    12 | 2012 | ***  |
| NY    | Monroe |     1 | 2013 | ***  |
| ...   |        |       |      |      |
| NY    | Monroe |    12 | 2013 | ***  |
| NY    | Essex  |     1 | 2011 | ***  |
| ...   |        |       |      |      |
| NY    | Essex  |    12 | 2011 | ***  |
| NY    | Essex  |     1 | 2012 | ***  |
| ...   |        |       |      |      |
| NY    | Essex  |    12 | 2012 | ***  |
| NY    | Essex  |     1 | 2013 | ***  |
| ...   |        |       |      |      |
| NY    | Essex  |    12 | 2013 | ***  |
+-------+--------+-------+------+------+

密钥:***是默认表中的费率。 ###是来自其他表的费率

1 个答案:

答案 0 :(得分:3)

我认为最好的方法是生成地理和时间的所有组合。您可以从state获取countytablea,然后与year中的monthtableb交叉加入。然后使用left join查看tablea中是否有任何值。如果是这样,请选择它。否则,请从tableb

中获取值
select sc.state, sc.county, ym.year, ym.month, coalesce(a.rate, ym.rate) as rate
from (select distinct state, county from tablea) sc cross join
     tableb ym left outer join
     tablea a
     on a.state = sc.state and a.county = sc.county and
        a.year = ym.year and a.month = ym.month ;

+ 7chars