我试图将存储在垂直模型中的数据表转换为更加水平的SQL Server类表模型。不幸的是,由于数据的性质,我不能在这里使用真实的数据,所以我编写了一个遵循相同模型的通用示例。自左连接重复
表中有三列,即ID,列ID和值,其中ID和列ID构成主键。此外,需要没有数据(即一个ID可以缺少列ID = 3不破坏任何东西)
PetID | ColumnID | Value
---------------------------
1 | 1 | Gilda
1 | 2 | Cat
2 | 1 | Sonny
2 | 2 | Cat
2 | 3 | Black
由于这样的事实,主键是两列的复合,我不能使用内置的PIVOT功能,所以我尝试做一个自我LEFT JOIN:
SELECT T1.PetID
,T2.Value AS [Name]
,T3.Value AS [Type]
,T4.Value AS [Color]
FROM @Temp AS T1
LEFT JOIN @Temp AS T2 ON T1.PetID = T2.PetID
AND T2.ColumnID = 1
LEFT JOIN @Temp AS T3 ON T1.PetID = T3.PetID
AND T3.ColumnID = 2
LEFT JOIN @Temp AS T4 ON T1.PetID = T4.PetID
AND T4.ColumnID = 3;
的想法是,我想借此从T1的ID,然后做一个自我LEFT JOIN通过ColumnID的获得每个值。但是我得到的重复数据:
PetID | Name | Type | Color
------------------------------
1 | Gilda | Cat | NULL
1 | Gilda | Cat | NULL
2 | Sonny | Cat | Black
2 | Sonny | Cat | Black
2 | Sonny | Cat | Black
我能够摆脱使用DISTINCT这些重复的,但该数据集是相当大的,因此所需要的那种动作大大减慢查询。有没有更好的方法来完成这个或我只是坚持一个缓慢的查询?
确实有更好的方法来完成加入部分,但我确实相信GROUP BY比DISTINCT快,您可以使用它来删除重复项。 – GendoIkari
@GendoIkari,true,但GROUP BY仍然会在后台使用排序并减慢查询速度。我真的很想找一个更有效的方法来做这些连接,但是谢谢你的建议。 –
加入会带来更多的行,但你有一些有趣的答案来解决加入 – Paparazzi