Sql 如何在映射表中获取列以键命名的表

Sql 如何在映射表中获取列以键命名的表,sql,join,relational-database,Sql,Join,Relational Database,我想要一个表的“平面”表示和一个对应的带有键值对的映射表,其中键用作结果中的列。 例如,假设我有一个表,其与manny的关系如下: Table Items(ID, Name) | ID | Name | |----|-------| | 1 | Item1 | | 2 | Other | Table KeyValue(ID, Key, Value, ItemID[FK->Items]) | ID | Key | Value | ItemID[FK->Items] | |-

我想要一个表的“平面”表示和一个对应的带有键值对的映射表,其中键用作结果中的列。 例如,假设我有一个表,其与manny的关系如下:

Table Items(ID, Name)
| ID | Name  |
|----|-------|
|  1 | Item1 |
|  2 | Other |

Table KeyValue(ID, Key, Value, ItemID[FK->Items])
| ID | Key  | Value  | ItemID[FK->Items] |
|----|------|--------|-------------------|
|  1 | key1 | value1 |                 1 |
|  2 | key2 | value2 |                 1 |
|  3 | key3 | value3 |                 1 |
|  4 | key1 | valueX |                 2 |
|  5 | key3 | valueY |                 2 |
|  6 | key4 | valueZ |                 2 |
| ID | Name  | key1   | key2   | key3   | key4   |
|----|-------|--------|--------|--------|--------|
|  1 | Item1 | value1 | value2 | value3 | NULL   |
|  2 | Other | valueX | NULL   | valueY | valueZ |

如何联接/处理这些表以获得如下表:

Table Items(ID, Name)
| ID | Name  |
|----|-------|
|  1 | Item1 |
|  2 | Other |

Table KeyValue(ID, Key, Value, ItemID[FK->Items])
| ID | Key  | Value  | ItemID[FK->Items] |
|----|------|--------|-------------------|
|  1 | key1 | value1 |                 1 |
|  2 | key2 | value2 |                 1 |
|  3 | key3 | value3 |                 1 |
|  4 | key1 | valueX |                 2 |
|  5 | key3 | valueY |                 2 |
|  6 | key4 | valueZ |                 2 |
| ID | Name  | key1   | key2   | key3   | key4   |
|----|-------|--------|--------|--------|--------|
|  1 | Item1 | value1 | value2 | value3 | NULL   |
|  2 | Other | valueX | NULL   | valueY | valueZ |

编辑:

这些键将是可变的irl。 在现实世界中,我试图实现一个花园数据库。 在那里,我有一个映射表“日期”,其中包含植物的重要日期-例如

Table Dates(ID, Event, Date, PlantID[FK->Plants])
因此,如果我向一个工厂添加一个带有事件的日期,而另一个工厂有一个具有相同事件名称的日期,那么事件应该是一列

| Plant | planted    | harvested | cut        |
| Tree  | 01/01/2018 | 01/09/2019| 02/09/2019 |
| Tree2 | 01/01/2017 | -         | 02/09/2019 |
如果我给树2添加一个“收获的”日期,它应该出现在“收获的”列中。 如果我给Tree2添加一个“newEvent”-Date,那么应该有一个额外的列“newEvent”,其中Tree1的条目为NULL。
…但我还不知道将存储哪些可能的事件。

使用条件聚合

select t1.id,name
max(case when t2.key='key1' then value end),
max(case when t2.key='key4' then value end),
max(case when t2.key='key2' then value end),
max(case when t2.key='key3' then value end)
from Items t1 join KeyValue t2 on t1.id=t2.ItemID
group by t1.id,name

嗯……我不知道钥匙是什么。我只是选择了任意名称作为示例。所以列名也应该是可变的。我不知道键是什么。我只是选择了任意名称作为示例。因此列名也应该是可变的。我将编辑问题以使其生效clear@kai-dj原问题回答正确。您所做的编辑提出了一个完全不同的问题。此查询不适用于已修改的问题。我认为你应该删除编辑,保留原来的问题,然后问一个反映编辑版本的新问题。不是真的-你认为关键点会被修复。我没有说原始问题中的密钥集有限,也没有暗示限制…@kai dj建议的解决方案只适用于原始问题。如果在答案发布后进行编辑,此解决方案将不起作用。对于修改后的问题,我没有解决方案。问题是“我有一个问题通过这个例子说明”。当然,这个例子并不完美,我应该说得很清楚,关键不受限制。但我没有问“如何解决这个例子”,也没有说钥匙会受到限制。如果我问“如何计算BASH中两个整数的和?例如…”,答案不会是“echo4”。