SQL - 通过查询重新排列表

标签 sql

我继承了一个设计不佳的表格。 它看起来像:

    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/

相关文章:

mysql - 如何在sql中让int>255

java - 该查询的 Hibernate 等效项是什么?(添加两列)

php - MySQL 增长变化之和与增长顺序

mysql - SQL 使用 "alter table"将 varchar(255) 转换为 int(11)

php - 如何通过两个 AND 条件过滤一列?

SQL Int类型默认值问题

sql - 集成 Kafka 和 sql server 2008

python - Django 过滤器查询集在 "tuples"的多列值上

java - android studio sqlite方法错误

mysql - 一对多关系的 SQL 查询