2012-12-06 55 views
0

我有需要合併如下表: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,但不確定它在這裏很有用。

+0

爲什麼B來到4,而在只有3次進出料口放? –

+0

,因爲與B(在表1中)關聯的old_number大於表2中的全部3個new_number,但A的old_number僅大於表2中的2個new_number –

回答

1

在我看來,你需要的數據的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