2013-06-21 105 views
1

我有以下2个表SQL Server数据库:在一个SQL Server视图 - 如何多列的结果合并成一列

​​

我已经创建了下面的查询和结果的看法:

enter image description here

我的问题是什么样的查询会带来(3)ID列在“表2”到一个主ID名单到最后的结果是这样的:

ID Table1ID 
test1 1 
test1 4 
test2 1 
test2 2 
test3 1 
test3 2 
test3 3 

注:这里是鉴于如上图所示:

SELECT   
    dbo.Table1.Description, Table2_1.ID AS Table2ID_1, Table2_2.ID AS Table2ID_2, 
    dbo.Table2.ID AS Table2ID_3 
FROM    
    dbo.Table1 
LEFT OUTER JOIN 
    dbo.Table2 ON dbo.Table1.ID = dbo.Table2.Table1ID3 
LEFT OUTER JOIN 
    dbo.Table2 AS Table2_2 ON dbo.Table1.ID = Table2_2.Table1ID2 
LEFT OUTER JOIN 
    dbo.Table2 AS Table2_1 ON dbo.Table1.ID = Table2_1.Table1ID1 

回答

1

微软SQL Server 2005和更高的支持UNPIVOT声明使得CROSS应用不必要的。

SELECT Description AS [ID], Table1ID 
FROM   (SELECT  Table1.Description, Table2_1.ID AS Table2ID_1, Table2_2.ID AS Table2ID_2, Table2.ID AS Table2ID_3 
       FROM   Table1 LEFT OUTER JOIN 
            Table2 ON Table1.ID = Table2.Table1ID3 LEFT OUTER JOIN 
            Table2 AS Table2_2 ON Table1.ID = Table2_2.Table1ID2 LEFT OUTER JOIN 
            Table2 AS Table2_1 ON Table1.ID = Table2_1.Table1ID1) AS pvttbl 
    UNPIVOT (Table1ID FOR ID IN (Table2ID_1, Table2ID_2, Table2ID_3)) AS unpvttbl 
ORDER BY Description, Table1ID 

请参阅MSDN上的Using PIVOT and UNPIVOT

+0

CROSS APPLY与UNPIVOT做同样的事情。 – Taryn

+0

感谢您花费在此上的时间......我选择了@JamieSee作为回答,因为它应用UNPIVOT要干净得多。它看起来像我只能选择一个作为答案,或者我会选择两个。再次感谢! – blub

+0

@blub虽然这个答案可以让你得到结果,但为了得到最终结果,你无需多次加入你的表。你看过这个版本的执行计划还是我提供的版本?如果您真的想要使用UNPIVOT,我收录了一个不需要4个连接的版本。 – Taryn

4

我的建议是UNPIVOT的数据Table2这样你就可以轻松地对数据结合,那么你就可以返回table1的描述和table2 id。使用CROSS此查询的UNPIVOT部分适用于:

select col, value, t2.Id 
from table2 t2 
cross apply 
(
    select 'table1id1', table1id1 union all 
    select 'table1id2', table1id2 union all 
    select 'table1id3', table1id3 
) c (col, value); 

SQL Fiddle with Demo。这给出了一个结果:

|  COL | VALUE | ID | 
--------------------------- 
| table1id1 |  1 | 1 | 
| table1id2 |  2 | 1 | 
| table1id3 |  3 | 1 | 
| table1id1 |  2 | 2 | 
| table1id2 |  3 | 2 | 
| table1id3 | (null) | 2 | 
| table1id1 |  3 | 3 | 

现在,你有行中的数据,你可以很容易地加入对value列返回id

select t1.description, 
    d.id 
from table1 t1 
inner join 
(
    select col, value, t2.Id 
    from table2 t2 
    cross apply 
    (
    select 'table1id1', table1id1 union all 
    select 'table1id2', table1id2 union all 
    select 'table1id3', table1id3 
    ) c (col, value) 
) d 
    on t1.id = d.value 
order by t1.description, d.id; 

SQL Fiddle with Demo

如果你真的想要使用UNPIVOT,那么您可以使用以下不多于每个表加入的结果:

select t1.description, t2.id 
from table1 t1 
inner join 
(
    select id, col, value 
    from 
    (
    select id, [Table1ID1], [Table1ID2], [Table1ID3] 
    from table2 
) d 
    unpivot 
    (
    value for col in ([Table1ID1], [Table1ID2], [Table1ID3]) 
) unpiv 
) t2 
    on t1.id = t2.value 
order by t1.description, t2.id; 

参见SQL Fiddle with Demo

的UNPIVOT和CROSS应用正在做同样的事情,作为一个UNION ALL查询:

select t1.description, t2.id 
from table1 t1 
inner join 
(
    select id, 'table1id1' col, table1id1 value 
    from table2 
    union all 
    select id, 'table1id2' col, table1id2 
    from table2 
    union all 
    select id, 'table1id3' col, table1id3 
    from table2 
) t2 
    on t1.id = t2.value 
order by t1.description, t2.id; 

SQL Fiddle with Demo

相关问题