我已将一些数据从 excel 表导入到 SQL 表中,现在我需要在数据上编写一个视图以将其与其他一些字段结合起来。
我的问题是这些列的表格如下所示;
名称 Project_One_ID Project_Two_ID Project_Three_ID
而不是我可以使用的表格,它是一个带有这样列的链接表;
名称 项目ID
是否可以转换这种类型的表?还是按原样使用?我可以在代码中做到这一点,但我在 SQL 中苦苦挣扎。我还有另外两个表需要链接到此链接表的任一侧以创建我的整体视图。
感谢您的任何指点,
我已将一些数据从 excel 表导入到 SQL 表中,现在我需要在数据上编写一个视图以将其与其他一些字段结合起来。
我的问题是这些列的表格如下所示;
名称 Project_One_ID Project_Two_ID Project_Three_ID
而不是我可以使用的表格,它是一个带有这样列的链接表;
名称 项目ID
是否可以转换这种类型的表?还是按原样使用?我可以在代码中做到这一点,但我在 SQL 中苦苦挣扎。我还有另外两个表需要链接到此链接表的任一侧以创建我的整体视图。
感谢您的任何指点,
你可以这样做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
根据您的 SQL Server 版本,您可以使用 CROSS APPLY 取消透视数据。
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)
如果 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
编写此查询的最有效方法是将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放在视图中以便于访问或使用它来创建包含所需列的新表。