SQL合并两个大的数据表没有唯一键
问题描述:
我有需要合并如下表:SQL合并两个大的数据表没有唯一键
表1:
main_key | sec_key | old_number | var1 | VAR2
1 | A | 5 | AA | 11
1 | B | 8 | BB | 22
表2:
main_key | new_number | var1 | VAR2
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。
另外,应该有一行原始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和用于其余所有其他sec_ke在其他main_keys中。
预计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或加入的,但不知道如何做到这一点,并保持从表1原线每个sec_key。
我的问题是,main_key不是一个唯一的密钥。 我也考虑过使用CTE,但不确定它在这里很有用。
答
在我看来,你需要的数据的UNION从table1
加上table2
专门加入的table1
:
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
为什么B来到4,而在只有3次进出料口放? –
,因为与B(在表1中)关联的old_number大于表2中的全部3个new_number,但A的old_number仅大于表2中的2个new_number –