0

我有两张桌子:

旧表(OT)

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

新表 (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 服务器 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 回答