【发布时间】:2021-02-22 22:25:36
【问题描述】:
使用 SQL Server。这似乎有点像带有 ROW_NUMBER 的 Pivot,但我在学习曲线上遇到了很多麻烦,无法弄清楚所有可以在我的 2 张桌子上工作的部分。
表 A 中每个项目都有一行(按 ID)。我的结果中需要此表中的一些列值。
表 B 的每个项目都有多行,每行描述项目的不同配置设置值。每个配置设置都有一个名称和一个值。我想从表 B 中提取几个不同的设置名称,并在结果集中的列中显示匹配的设置值。
Table A
ID | Name
1001 | William
1002 | Patricia
Table B
ID | ItemID | Setting | Value
999 | 1001 | EyeColor | Blue
998 | 1001 | Nickname | Billy
997 | 1002 | Nickname | Trish
996 | 1002 | EyeColor | Green
Desired Result
ItemID | Name | EyeColor | Nickname
1001 | William | Blue | Billy
1002 | Patricia| Green | Trish
我目前正在做的事情是:
SELECT
A.ID,
A.Name,
'EyeColor' = (SELECT B.Value FROM B WHERE B.ItemID = A.ID AND B.Setting = 'EyeColor'),
'Nickname' = (SELECT B.Value FROM B WHERE B.ItemID = A.ID AND B.Setting = 'Nickname')
FROM TableA as A
WHERE (some criteria that filters on values in Table A)
但这似乎很笨拙,我有点想知道这是否不能很好地扩展到表 A 的结果集中包含 2000 个项目的结果集。
关于更好的方法的建议?
【问题讨论】:
-
可以肯定的是,这是最好的......没有捷径。
-
这很笨拙,因为这不是一个正确规范化的模式。您有一个 EAV 设计(搜索网络以获取更多信息) - 您现在可以更好地理解为什么“灵活性”会带来重大损失。
-
唯一的其他解决方案同样笨拙,可能会或可能不会更高效:加入表格并按 ID 分组,名称然后选择
MIN(CASE WHEN B.Setting = 'EyeColor' THEN B.VALUE END)
标签: sql sql-server tsql pivot