SQL 连接包含维度的表
SQL joins with tables that contain dimensions
如何连接表 1 和表 2(包含维度及其值)以获得以下结果:
更新
感谢您提出使用 PIVOT 的方式。只是出于好奇 - 是否可以通过多个左连接来解决它?
更新 2
我想与您分享我解决几个左连接问题的想法。它非常简单并且比 Pivot 方式快得多。您可以在下面找到我的答案。
declare @table1 table
(
id int,
salary int
)
insert into @table1
values
(1, 1000),
(2, 2000)
declare @table2 table
(
id int,
dimension varchar(1000),
dimensionValue varchar(1000)
)
insert into @table2
values
(1, 'eyes','blue'),
(1, 'sex','male'),
(1, 'worker type','marvelous'),
(2, 'eyes','brown'),
(2, 'sex', 'female'),
(2, 'worker type','spectacular')
使用数据透视查询
SELECT t2.*, t1.salary
FROM
@table1 t1
join
(SELECT * FROM @table2) AS SourceTable
PIVOT
(
max(dimensionValue)
FOR dimension IN ([eyes],[worker type],[sex])
) AS T2
on T2.id = t1.id
试试下面的代码:
WITH PivotTable2 AS
(
SELECT ID, SEX, EYES, [WORKER TYPE]
FROM (
SELECT ID, DIMENSION, [DIMENSION VALUE]
FROM Table2) up
PIVOT (MAX([DIMENSION VALUE]) FOR DIMENSION IN (SEX, EYES, [WORKER TYPE])) AS pvt
)
SELECT T1.ID,T1.Salary,T2.SEX,T2.EYES,T2.[WORKER TYPE]
FROM Table1 AS T1
LEFT JOIN PivotTable2 T2 ON T1.ID=T2.ID
希望对您有所帮助!
使用左连接:
CREATE TABLE #Table1
(
ID int,
Salary int
)
INSERT INTO #Table1
VALUES
(1, 1000),
(2, 2000)
CREATE TABLE #Table2
(
ID int,
Dimension varchar(1000),
DimensionValue varchar(1000)
)
INSERT INTO #Table2
VALUES
(1, 'eyes','blue'),
(1, 'sex','male'),
(1, 'worker type','marvelous'),
(2, 'eyes','brown'),
(2, 'sex', 'female'),
(2, 'worker type','spectacular')
SELECT T1.ID,S.Sex,E.Eyes,WT.[Worker Type]
FROM #Table1 AS T1
LEFT JOIN
( SELECT ID,
DimensionValue AS Sex
FROM #Table2
WHERE Dimension='sex'
) S ON T1.ID=S.ID
LEFT JOIN
( SELECT ID,
DimensionValue AS Eyes
FROM #Table2
WHERE Dimension='eyes'
) E ON T1.ID=E.ID
LEFT JOIN
( SELECT ID,
DimensionValue AS [Worker Type]
FROM #Table2
WHERE Dimension='worker type'
) WT ON T1.ID=WT.ID
DROP TABLE #Table1,#Table2
必须提到每个维度的左连接..!!
我的经验得出了这段代码,我想与您分享。关键是每次我们进行左连接时都为维度 table 分配新的别名。
SELECT
T1.ID
,S.DimensionValue AS Sex
,E.DimensionValue AS Eyes
,WT.DimensionValue AS [Worker Type]
FROM #Table1 AS T1
LEFT JOIN #Table2 AS S -- new alias here for dimension table
ON T1.ID=S.ID AND S.Dimension='sex'
LEFT JOIN #Table2 AS E -- new alias here for dimension table
ON T1.ID=E.ID AND E.Dimension='eyes'
LEFT JOIN #Table2 AS WT -- new alias here for dimension table
ON T1.ID=WT.ID AND WT.Dimension='worker type'
如何连接表 1 和表 2(包含维度及其值)以获得以下结果:
更新 感谢您提出使用 PIVOT 的方式。只是出于好奇 - 是否可以通过多个左连接来解决它?
更新 2 我想与您分享我解决几个左连接问题的想法。它非常简单并且比 Pivot 方式快得多。您可以在下面找到我的答案。
declare @table1 table
(
id int,
salary int
)
insert into @table1
values
(1, 1000),
(2, 2000)
declare @table2 table
(
id int,
dimension varchar(1000),
dimensionValue varchar(1000)
)
insert into @table2
values
(1, 'eyes','blue'),
(1, 'sex','male'),
(1, 'worker type','marvelous'),
(2, 'eyes','brown'),
(2, 'sex', 'female'),
(2, 'worker type','spectacular')
使用数据透视查询
SELECT t2.*, t1.salary
FROM
@table1 t1
join
(SELECT * FROM @table2) AS SourceTable
PIVOT
(
max(dimensionValue)
FOR dimension IN ([eyes],[worker type],[sex])
) AS T2
on T2.id = t1.id
试试下面的代码:
WITH PivotTable2 AS
(
SELECT ID, SEX, EYES, [WORKER TYPE]
FROM (
SELECT ID, DIMENSION, [DIMENSION VALUE]
FROM Table2) up
PIVOT (MAX([DIMENSION VALUE]) FOR DIMENSION IN (SEX, EYES, [WORKER TYPE])) AS pvt
)
SELECT T1.ID,T1.Salary,T2.SEX,T2.EYES,T2.[WORKER TYPE]
FROM Table1 AS T1
LEFT JOIN PivotTable2 T2 ON T1.ID=T2.ID
希望对您有所帮助!
使用左连接:
CREATE TABLE #Table1
(
ID int,
Salary int
)
INSERT INTO #Table1
VALUES
(1, 1000),
(2, 2000)
CREATE TABLE #Table2
(
ID int,
Dimension varchar(1000),
DimensionValue varchar(1000)
)
INSERT INTO #Table2
VALUES
(1, 'eyes','blue'),
(1, 'sex','male'),
(1, 'worker type','marvelous'),
(2, 'eyes','brown'),
(2, 'sex', 'female'),
(2, 'worker type','spectacular')
SELECT T1.ID,S.Sex,E.Eyes,WT.[Worker Type]
FROM #Table1 AS T1
LEFT JOIN
( SELECT ID,
DimensionValue AS Sex
FROM #Table2
WHERE Dimension='sex'
) S ON T1.ID=S.ID
LEFT JOIN
( SELECT ID,
DimensionValue AS Eyes
FROM #Table2
WHERE Dimension='eyes'
) E ON T1.ID=E.ID
LEFT JOIN
( SELECT ID,
DimensionValue AS [Worker Type]
FROM #Table2
WHERE Dimension='worker type'
) WT ON T1.ID=WT.ID
DROP TABLE #Table1,#Table2
必须提到每个维度的左连接..!!
我的经验得出了这段代码,我想与您分享。关键是每次我们进行左连接时都为维度 table 分配新的别名。
SELECT
T1.ID
,S.DimensionValue AS Sex
,E.DimensionValue AS Eyes
,WT.DimensionValue AS [Worker Type]
FROM #Table1 AS T1
LEFT JOIN #Table2 AS S -- new alias here for dimension table
ON T1.ID=S.ID AND S.Dimension='sex'
LEFT JOIN #Table2 AS E -- new alias here for dimension table
ON T1.ID=E.ID AND E.Dimension='eyes'
LEFT JOIN #Table2 AS WT -- new alias here for dimension table
ON T1.ID=WT.ID AND WT.Dimension='worker type'