从基于两列的单行联接后需要两行

时间:2018-08-15 12:06:09

标签: sql sql-server join

我有一个三列的table1和一个单列的table2。

如果第一列的值为Y,那么连接后我需要表2中的特定值作为另一个表中的行;如果第二列为Y,那么我需要表2中的特定值作为第三表中的另一行加入后。两个表中没有公共列。

如果一行中的两列以Y作为值,那么连接后在最终表中需要两行。我现在使用case进行连接,但是只检查了一列。

有人可以帮我吗?

       table1                       
--------------------         
col1   col2  col3(pk)             
--------------------         
y       n     123                  
y       y     456


   table2                     
--------------------         
    col1               
--------------------         
    col1Y
    col2Y

预期产量

   table1                      
--------------------         
col1   col2             
--------------------         
 123   col1Y
 456   col1Y
 456   col2Y

4 个答案:

答案 0 :(得分:0)

select col3 as col1, 'col1y' as col2 from myTable where col1 = 'y'
union
select col3 as col1, 'col2y' as col2 from myTable where col2 = 'y'
--order by col1, col2;

SQLFiddle sample

答案 1 :(得分:0)

您还可以检查如何使用数据透视表命令转置表

SQL transpose full table

答案 2 :(得分:0)

我们可以unpivotjoin来获得您想要的结果:

declare @table1 table (col1 char(1),col2 char(1),col3 int)
insert into @table1(col1,col2,col3) values
('y','n',123)        ,   
('y','y',456)
declare @table2 table (col1 char(5))
insert into @table2 (col1) values
('col1Y'),('col2Y')

select
    u.col3 as col2,t2.col1 as col2
from
    @table1 t1
        unpivot
    (cval for cname in (col1,col2)) u
        cross apply
    (select cname + cval as Complete) v
        inner join
    @table2 t2
        on
            v.complete = t2.col1

结果:

col1        col2
----------- -----
123         col1Y
456         col1Y
456         col2Y

但是在unpivotcross apply之后,我们根本就没有 table2(我们可以将其过滤到{{ 1}}是cval)。但是目前,我已经将它包括进来,以防万一我丢失了一些东西或者在查询中还有更多内容要构建。

答案 3 :(得分:0)

不确定是否需要table2,但是在这里可以使用case语句。

gevent

SQL Fiddle Sample