0

マージする必要がある次のテーブルがあります。

表1:

メインキー | sec_key | 古い番号 | var1 | var2

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

表 2:

メインキー | 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 に更新します。

また、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_keys と、他の main_keys 内の他のすべての sec_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 または join のいずれかを使用することを考えましたが、これを行う方法と、各 sec_key の table1 からの元の行を保持する方法がわかりません。

私の問題は、main_key が一意のキーではないことです。CTE の使用も検討しましたが、ここで役立つかどうかはわかりません。

4

1 に答える 1

1

からのデータの UNION とwithtable1の特殊な結合が必要であるように私には思えます: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
于 2012-12-11T01:58:54.207 に答える