我继承了一个设计不佳的表格。 它看起来像:
User Field Value ------------------- 1 name Aaron 1 email [email protected] 1 phone 800-555-4545 2 name Mike 2 email [email protected] 2 phone 777-123-4567 (etc, etc)
我希望通过查询以更合理的格式提取这些数据:
User Name Email Phone ------------------------------------------- 1 Aaron [email protected] 800-555-4545 2 Mike [email protected] 777-123-4567
我是一名 SQL 新手,但尝试过使用 Group By 变体进行多种查询, 所有这些都没有任何接近成功的地方。
是否有 SQL 技术可以让这变得简单?
最佳答案
这不是一个“设计糟糕的表格”;但实际上是一个实体属性值(EAV)表。不幸的是,关系数据库不是实现此类表的糟糕平台,并且否定了 RDBMS 的大部分优点。使用错误的铲子钉螺丝的常见情况。
但我认为这会起作用(基于 Marcus Adams' 答案,我认为这不起作用(编辑:现在它起作用了))
SELECT User1.Value AS name, User2.Value AS email, User3.Value AS phone
FROM Users User1
LEFT JOIN Users User2
ON User2.User = User1.User AND User2.Field='email'
LEFT JOIN Users User3
ON User3.User = User1.User AND User3.Field='phone'
WHERE User1.Field = 'name'
ORDER BY User1.User
编辑:从其他答案中得到了一些细节(LEFT Joins,以及 ON 子句中的字段名称),现在有人知道如何将剩余的 WHERE 放在更高的位置吗? (但不是在第一个 JOIN 为 ON 时,那太难看了),当然这并不重要,因为查询优化器无论如何都会将其丑化回来。
关于SQL - 通过查询重新排列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2769470/