1

我有一个带有以下 2 个表的 SQL Server 数据库:

在此处输入图像描述

我创建了一个包含以下查询和结果的视图:

在此处输入图像描述

我的问题是什么查询会将“Table2”中的 (3) ID 列带入一个主 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
4

2 回答 2

4

我的建议是 UNPIVOT 中的数据,Table2以便您可以轻松地加入数据,然后您可以返回 table1 描述和 table2 id。此查询的 UNPIVOT 部分使用 CROSS APPLY:

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

如果您真的想使用 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 APPLY 与 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

于 2013-06-21T21:55:01.300 回答
1

Microsoft SQL Server 2005 和更高版本支持 UNPIVOT 语句,因此不需要 CROSS APPLY。

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 上的使用 PIVOT 和 UNPIVOT

于 2013-06-21T23:25:04.327 回答