2013-06-21 104 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

相關問題