我有两个表,其模式与示例表1和示例表2相似。两个表都有用于标识两个表中数据的列。列A和B在两个表中。
表格1:
Col A | Col B | Col C | Col D --------+-------+-------+------ Cat 1 | Bla a | C-1 | D-1 Cat 1 | Bla a | C-2 | D-2 Cat 1 | Bla a | C-3 | D-3 Cat 2 | Bla b | C-4 | D-4 Cat 2 | Bla b | C-5 | D-5
表2:
Col A | Col B | Col E --------+-------+------ Cat 1 | Bla a | E-1 Cat 2 | Bla b | E-2 Cat 2 | Bla b | E-3 Cat 2 | Bla b | E-4
所需的输出表:
Col A | Col B | Col C | Col D | Col E --------+-------+-------+-------+------ Cat 1 | Bla a | C-1 | D-1 | E-1 Cat 1 | Bla a | C-2 | D-2 | NULL Cat 1 | Bla a | C-3 | D-3 | NULL Cat 2 | Bla b | C-4 | D-4 | E-2 Cat 2 | Bla b | C-5 | D-5 | E-3 Cat 2 | Bla b | NULL | NULL | E-4
我需要组合,合并,更新,循环或以某种方式找到在单个表中产生的方法。在此单个表中,我需要示例表1唯一的列中的值与示例表1中的公共列值对齐。我还需要示例表2唯一的列中的值,以使其与示例表2一致。与示例表2中的常用列值对齐。
如果对于一个表,有更多的记录具有与公共列匹配的值,则与另一个表相匹配,则唯一值应为null,因为该记录将成为其他唯一值的占位符。
表1具有3个记录,在A和B列中的值分别为Cat 1和Bla a。表2具有1个记录,在A和B列中的值分别为Cat 1和Bla a。因此,所需的表必须具有两个记录,其中a为E列的null或空白值。
在尝试执行联接或完全外部联接时,我得到了示例错误输出表中显示的结果。
期望的输出表不应包含重复任一表中唯一值的值的记录。这在错误的输出表示例中显示。
错误输出示例:
Col A | Col B | Col C | Col D | Col E --------+-------+-------+-------+------ Cat 1 | Bla a | C-1 | D-1 | E-1 Cat 1 | Bla a | C-2 | D-2 | E-1 Cat 1 | Bla a | C-3 | D-3 | E-1 Cat 2 | Bla b | C-4 | D-4 | E-2 Cat 2 | Bla b | C-4 | D-4 | E-3 Cat 2 | Bla b | C-4 | D-4 | E-4 Cat 2 | Bla b | C-5 | D-5 | E-2 Cat 2 | Bla b | C-5 | D-5 | E-3 Cat 2 | Bla b | C-5 | D-5 | E-4
declare @t1 table ( col_a varchar(5) null ,col_b varchar(5) null ,col_c varchar(5) null ,col_d varchar(5) null ) declare @t2 table ( col_a varchar(5) null ,col_b varchar(5) null ,col_e varchar(5) null ) insert into @t1 values ('Cat 1','Bla a','C-1','D-1') ,('Cat 1','Bla a','C-2','D-2') ,('Cat 1','Bla a','C-3','D-3') ,('Cat 2','Bla b','C-4','D-4') ,('Cat 2','Bla b','C-5','D-5') insert into @t2 values ('Cat 1' , 'Bla a' , 'E-1' ) ,('Cat 2' , 'Bla b' , 'E-2 ' ) ,('Cat 2' , 'Bla b' , 'E-3' ) ,('Cat 2' , 'Bla b' , 'E-4') select isnull(a.col_a,b.col_a) col_a, isnull(a.col_b,b.col_b) col_b, a.col_c,a.col_d,b.col_e from ( select *,row_number() over (partition by col_a order by col_c) rown from @t1 ) a full outer join ( select *,row_number() over (partition by col_a order by col_e) rown from @t2 ) b on a.col_a = b.col_a and a.col_b = b.col_b and a.rown = b.rown order by isnull(a.col_a,b.col_a),isnull(a.rown,b.rown)
使用row_number作为完全连接的一部分可以创建空值。