【问题标题】:SQL merging two big data tables without a unique keySQL合并两个没有唯一键的大数据表
【发布时间】:2012-11-24 10:35:25
【问题描述】:

我有以下表格需要合并:

表 1:

主键 | sec_key |旧号码 |变量1 |变量2

 1      |  A    |    5     | AA | 11
 1      |  B    |    8     | BB | 22

表 2:

主键 |新号码 |变量1 |变量2

 1      |   2       | DD | 44
 1      |   3       | EE | 55
 1      |   7       | FF | 66

我无法修改表(没有插入,因此我不能使用“合并”,只能使用 UNION)。

两个表都包含大量数据,我需要最有效的方法来合并它们。

  • 合并应该根据main_key,对于table1.sec_key中的每一个,
  • 如果table2.new_number

另外,应该有一行原始 table1 值与 old_number。

例子:

  • 对于第一个 table1.sec_key:它的 old_number 是 5。
  • table2.new_number '2' 小于 5,table2.new_number '3' 也小于 5 但 table2.new_number '7' 大于 5
  • 因此输出将包括 old_numbers 以及 new_number=2 和 new_number=3 的行:

(其余的 sec_keys 和其他 main_keys 中的所有其他 sec_keys 也是如此。

示例的预期输出表:

main_key | sec_key | number | var1 | var2
    1    |    A    |    5   |  AA  |  11
    1    |    A    |    2   |  DD  |  44     
    1    |    A    |    3   |  EE  |  55
    1    |    B    |    8   |  BB  |  22  
    1    |    B    |    2   |  DD  |  44     
    1    |    B    |    3   |  EE  |  55
    1    |    B    |    7   |  FF  |  66

我考虑过使用 UNION 或加入,但不确定如何执行此操作并为每个 sec_key 保留 table1 中的原始行。

我的问题是 main_key 不是唯一键。 我也考虑过使用 CTE,但不确定它在这里是否有用。

【问题讨论】:

  • 为什么 B 出现 4 次,而 A 只出现 3 次预期输出?
  • 因为与B关联的old_number(在table1中)大于table2中的所有3个new_numbers,但A的old_number仅大于table2中的2个new_numbers

标签: sql sql-server-2012 bigdata


【解决方案1】:

在我看来,您需要来自 table1 的数据的 UNION 以及 table1table2 的专门连接:

SELECT main_key, sec_key, old_number AS number, var1, var2
  FROM table1
UNION
SELECT t1.main_key, t1.sec_key, t2.new_number AS number, t2.var1, t2.var2
  FROM table1 AS t1
  JOIN table2 AS t2 ON t2.main_key = t1.main_key AND t2.new_number < t1.old_number

根据您的测试数据,它会产生您想要的答案(排序由ORDER BY main_key, sec_key, number 控制):

1   A   2   DD   44
1   A   3   EE   55
1   A   5   AA   11
1   B   2   DD   44
1   B   3   EE   55
1   B   7   FF   66
1   B   8   BB   22

如果你真的希望原始行出现在合并的行之前,你必须做更多的工作:

SELECT u.main_key, u.sec_key, u.number, u.var1, u.var2
  FROM (SELECT 0 AS pseudo_order, main_key, sec_key, old_number AS number, var1, var2
          FROM table1
        UNION
        SELECT 1 AS pseudo_order, t1.main_key, t1.sec_key, t2.new_number AS number,
               t2.var1, t2.var2
          FROM table1 AS t1
          JOIN table2 AS t2 ON t2.main_key = t1.main_key AND t2.new_number < t1.old_number
       ) AS u
 ORDER BY u.pseudo_order, u.main_key, u.sec_key, u.number;

输出:

1   A   5   AA   11
1   A   2   DD   44
1   A   3   EE   55
1   B   8   BB   22
1   B   2   DD   44
1   B   3   EE   55
1   B   7   FF   66

【讨论】:

    猜你喜欢
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多