【发布时间】:2016-04-16 04:45:36
【问题描述】:
我正在尝试将存储在垂直模型中的数据表转换为更水平的、类似于 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,是的,但 GROUP BY 仍将在后台使用排序并减慢查询速度。我真的在寻找一种更有效的方式来进行连接,但感谢您的建议。
-
加入会带来更多的行,但你有一些有趣的答案可以绕过加入
-
你真的在使用表变量吗?如果是这样,请尝试使用#temp。您可以使用表变量获得糟糕的执行计划。表变量通常不是很多行。
-
@Frisbee,真实数据使用SQL Server中的一个表。为简单起见,该示例仅使用表变量。
标签: sql-server duplicates left-join distinct self-join