SQL平表查询

时间:2013-07-08 14:34:30

标签: sql sql-server

我已将excel表中的一些数据导入到SQL表中,现在我需要编写一个数据视图,将其与其他一些字段组合。

我的问题是表格的格式如下:

名称 Project_One_ID Project_Two_ID Project_Three_ID

而不是我可以使用的形式,这将是一个像这样的列的链接表;

名称 ProjectID

是否可以转换此类表格?或者按原样使用它?我可以在代码中完成它,但我在SQL中苦苦挣扎。我有两个其他表需要链接到此链接表的任一侧以创建我的整体视图。

感谢您的任何指示,

4 个答案:

答案 0 :(得分:4)

您可以将其作为UNION,然后加入其他表:

SELECT * FROM
(
    SELECT Name, Project_One_ID ProjectID
    FROM Projects
    UNION ALL
    SELECT Name, Project_Two_ID ProjectID
    FROM Projects
    UNION ALL
    SELECT Name, Project_Three_ID ProjectID
    FROM Projects
) AS P
INNER JOIN ProjectData PD
ON P.ProjectID = PD.ProjectID

答案 1 :(得分:2)

根据您的SQL Server版本,您可以使用CROSS APPLY来UNPIVOT数据。

CROSS APPLY和VALUES将在SQL Server 2008 +中运行:

select name,
  ProjectId
from yourtable
cross apply
(
  values
  ('Project_One_ID', Project_One_ID),
  ('Project_Two_ID', Project_Two_ID),
  ('Project_Three_ID', Project_Three_ID)
) c (col, ProjectId);

如果您使用的是SQL Server 2005,则可以使用CROSS APPLY和UNION ALL:

select name,
  ProjectId
from yourtable
cross apply
(
  select 'Project_One_ID', Project_One_ID union all
  select 'Project_Two_ID', Project_Two_ID union all
  select 'Project_Three_ID', Project_Three_ID  
) c (col, ProjectId)

答案 2 :(得分:0)

如果name是外键(异常 - 但我认为可能) 然后你可以把这些东西结合在一起..

select name, project_one_id as project_id
from newtable
union
select name, project_two_id 
from newtable
union
select name, project_three_id     
from newtable

答案 3 :(得分:0)

编写此查询的最有效方法是unpivot。这只扫描一次表。这是一个例子:

with t as (select 'a' as name, 1 as project_one, 2 as project_two, 3 as project_three)
select name, project
from t
unpivot (project for col in (project_one, project_two, project_three)) as unpvt

您可以将unpivot放在视图中以便于访问,也可以使用它来创建包含所需列的新表格。