小编典典

如何联接SQL Server中的多个列,并在一个表中包含其他表中不存在的列?

sql

我有两个表,其模式与示例表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

阅读 147

收藏
2021-05-16

共1个答案

小编典典

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作为完全连接的一部分可以创建空值。

2021-05-16