2016-02-18 26 views
0

我试图从存储双列中的键值对的SQLite表中提取数据。例如,用钥匙foobarmanrow,该表将如下所示:将键值列分组为一行

 
| _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

其中一个原因是多方面的EAV模型通常一个是SQL中的可怕想法。/soapbox –

回答

3

其他可用的选项是使用条件聚集

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 
+0

这很完美,谢谢!我从来没有想过使用这样的聚合函数。 – hairlessbear

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 
相关问题