0

私は2つのテーブルを持っています:

古いテーブル (OT)

 Record_id |  Name  |  Sequence_num
------------------------------------
    78     | Austin |  0
    78     | Mike   |  1
    78     | Joe    |  2

New_table (NT)

 Record_id |  Name  |  Sequence_num
------------------------------------
    78     | Mike   |  0
    78     | Joe    |  1
    78     | Austin |  2
    78     | Fred   |  3
    78     | Ben    |  4

私が探しているのは、次のような出力テーブルです。

 Record_id |  OT_Name  |  NT_Name  |  Sequence_num
---------------------------------------------------
    78     |  Austin   |  Mike     |  0
    78     |  Mike     |  Joe      |  1
    78     |  Joe      |  Austin   |  2
    78     |  NULL     |  Fred     |  3
    78     |  NULL     |  Ben      |  4

問題は、各テーブルにいくつの行があるのか​​ はっきりわからないことです。OT が 10 行で NT が 3 行、または NT が OT よりも多い行、またはそれらが同じ数である可能性があります。反対側のテーブルに一致する Sequence_num がない行は、適切な列に NULL 値を持つ必要があります。この状況ですべてのテーブルに関数を作成する以外に、select ステートメントでこれを達成するにはどうすればよいでしょうか? 私は一生解決策を思いつくことができません。

編集:

MS Sql Sever 2008 の使用

管理スタジオ 10.0.1600.22

4

2 に答える 2

3

構文をサポートするデータベースを使用している場合は、FULL OUTER JOIN次を使用できます。

select 
  coalesce(ot.record_id, nt.record_id) record_id,
  ot.name OT_Name,
  nt.name NT_name,
  coalesce(ot.sequence_num, nt.sequence_num) Sequence_num
from old_table ot
full outer join new_table nt
  on ot.record_id = nt.record_id
  and ot.sequence_num =  nt.sequence_num

デモで SQL Fiddle を参照してください

于 2013-02-21T21:30:56.650 に答える
2

以下は、どのデータベースでも機能します。依存しませんfull outer join:

select record_id,
       MAX(case when which = 'ot' then name end) as ot_name,
       MAX(case when which = 'nt' then name end) as nt_name,
       sequence_num
from ((select record_id, name, sequence_num, 'ot' as which
       from ot
      ) union all
      (select record_id, name, sequence_num, 'nt' as which
       from nt
      )
     ) t
group by record_id, sequence_num
于 2013-02-21T21:37:40.333 に答える