首页 > 解决方案 > 在 SQL 中连接表,其中新列名基于来自另一列的连接表值

问题描述

我有 2 个表,我正在尝试将第二个表的内容加入到第一个表中。本质上,我希望得到一个项目列表,其中包含第一个表中的所有字段,第二个表中的所有相关行,第二个表中列内容之后的名称。

表 A

+----+--------+---------------------+--------+
| ID | Title  |        Date         | Etc... |
+----+--------+---------------------+--------+
|  1 | QWERTY | 0000-00-00:00:00:00 |    ... |
|  2 | TEST   | 0000-00-00:00:00:00 |    ... |
|  3 | ASDF   | 0000-00-00:00:00:00 |    ... |
|  4 | IOP    | 0000-00-00:00:00:00 |    ... |
+----+--------+---------------------+--------+

表 B

+----+------------+------+------------+
| ID | Table_A_ID | Key  |   Value    |
+----+------------+------+------------+
|  1 |          1 | Name | John       |
|  2 |          2 | Name | Brad       |
|  3 |          1 | DOB  | 2000-01-16 |
+----+------------+------+------------+

所以我希望能够从表 A 中选择 * 并以某种方式结束以下

+----+--------+---------------------+--------+------+------------+
| ID | Title  |        Date         | Etc... | Name |    DOB     |
+----+--------+---------------------+--------+------+------------+
|  1 | QWERTY | 0000-00-00:00:00:00 |    ... | John | 2000-01-16 |
|  2 | TEST   | 0000-00-00:00:00:00 |    ... | Brad |            |
|  3 | ASDF   | 0000-00-00:00:00:00 |    ... |      |            |
|  4 | IOP    | 0000-00-00:00:00:00 |    ... |      |            |
+----+--------+---------------------+--------+------+------------+

关键是我不知道钥匙会是什么

不幸的是,我不知道这被称为谷歌它,我一直在查看内部,左,右连接,这些似乎并没有做我想做的事情。

标签: mysqlsql

解决方案


这可以通过 TableB 上的两个 JOIN 来实现,例如:

SELECT
    ta.id,
    ta.date,
    ta.etc,
    tb.value Name,
    td.value DOB
FROM
    tableA ta
    INNER JOIN tableB tb ON tb.table_a_id = tb.id AND tb.key = 'Name'
    INNER JOIN tableB td ON td.table_a_id = ta.id AND td.key = 'DOB'

使用此查询,只会显示在 TableB 中具有名称和 DOB 的记录。如果要避免过滤掉这些“不完整”的记录,可以使用 LEFT JOIN 代替 INNER JOIN。


推荐阅读