在同一结果行上进行查询并进行分组

时间:2020-02-07 06:51:48

标签: sql sqlite

我有两个桌子。这样。

select * from extrafieldvalues;
+----------------------------+
| id | value | type | idItem |
+----------------------------+
| 1  | 100   | 1    | 10     |
| 2  | 150   | 2    | 10     |
| 3  | 101   | 1    | 11     |
| 4  | 90    | 2    | 11     |
+----------------------------+
select * from items
+------------+
| id  | name |
+------------+
| 10  | foo  |
| 11  | bar  |
+------------+

我需要进行查询,并得到如下内容:

+--------------------------------------+
| idItem  | valtype1 | valtype2 | name |
+--------------------------------------+
| 10      | 100      | 150      | foo  |
| 11      | 101      | 90       | bar  |
+--------------------------------------+

额外字段值的类型数量是可变的,但是每一项始终使用每个额外字段。

2 个答案:

答案 0 :(得分:2)

使用条件聚合

select iditem, 
       max(case when type=1 then value end) as valtype1,
       max(case when type=2 then value end) as valtype2,name
from extrafieldvalues a inner join items b on a.iditem=b.id
group by iditem,name

答案 1 :(得分:2)

如果只有两个字段,则可以选择left join

select i.*, efv1.value as value_1, efv2.value as value_2
from items i left join
     extrafieldvalues efv1
     on efv1.iditem = i.id and
        efv1.type = 1 left join
     extrafieldvalues efv2
     on efv1.iditem = i.id and
        efv1.type = 2 ;

就性能而言,两个联接的速度可能比聚合要快-并且使从items引入更多列变得更加容易。另一方面,条件聚合更容易泛化,并且随着extrafieldvalues中的更多列添加到select中,性能几乎没有变化。