我试图从SQLite表中提取数据,该表存储双列中的键值对。例如,使用键foo
,bar
,man
和row
,表格如下所示:
| _id | external_id | key | value | |-----|-------------|------|-------| | 1 | 12345 | foo | cow | | 2 | 12345 | bar | moo | | 3 | 12345 | man | hole | | 4 | 12345 | row | boat | | 5 | 67980 | foo | abc | | 6 | 67890 | bar | def | | 7 | 67890 | man | ghi | | 8 | 67890 | row | jkl |
我想执行一个查询,该查询将每个external_id
连接到一行,其中键作为列,值作为行。像这样:
| external_id | foo | bar | man | row | |-------------|-----|------|------|------| | 12345 | cow | moo | hole | boat | | 67890 | abc | def | ghi | jkl |
我能够提出的唯一解决方案是每个密钥的加入:
SELECT a.external_id, b.foo, c.bar, d.main, e.row
FROM myTable AS a
LEFT JOIN
(SELECT external_id, key AS foo
FROM myTable
WHERE key="foo") AS b
ON a.external_id = b.external_id
...
LEFT JOIN
(SELECT external_id, key AS row
FROM myTable
WHERE key="row") AS e
ON a.external_id = e.external_id
GROUP BY a.external_id
有更好的方法吗?
答案 0 :(得分:6)
另一个可用选项是使用条件聚合:
SELECT external_id,
MAX(CASE WHEN key = 'foo' THEN value END) AS foo,
MAX(CASE WHEN key = 'bar' THEN value END) AS bar,
MAX(CASE WHEN key = 'man' THEN value END) AS man,
... etc
FROM mytable
GROUP BY external_id
答案 1 :(得分:0)
你也可以使用collect()方法
select external_id,
collected_objects['foo'] as foo,
collected_objects['bar'] as bar,
collected_objects['man'] as man,
collected_objects['row'] as row
from(
select external_id,
collect(key, value) as collected_objects
group by external_id)t1