我已将excel表中的一些数据导入到SQL表中,现在我需要编写一个数据视图,将其与其他一些字段组合。
我的问题是表格的格式如下:
名称 Project_One_ID Project_Two_ID Project_Three_ID
而不是我可以使用的形式,这将是一个像这样的列的链接表;
名称 ProjectID
是否可以转换此类表格?或者按原样使用它?我可以在代码中完成它,但我在SQL中苦苦挣扎。我有两个其他表需要链接到此链接表的任一侧以创建我的整体视图。
感谢您的任何指示,
答案 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
放在视图中以便于访问,也可以使用它来创建包含所需列的新表格。