0

我有以下需要合并的表:

表格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.var1、table1.var2 的值更新为对应的值:table2.var1 和 table2.var2。

此外,应该有一行带有 old_number 的原始 table1 值。

例子:

  • 对于第一个 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_key 和其他 main_key 中的所有其他 sec_key 也是如此。

该示例的预期 output_table :

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,但不确定它在这里是否有用。

4

1 回答 1

1

在我看来,您需要一个 UNION 的数据table1加上一个专门的table1with连接table2

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
于 2012-12-11T01:58:54.207 回答