参见下表:
CREATE TABLE boxes (
box integer,
color character varying,
size integer,
...
);
box
和color
都可以假设不是小的唯一值
集。
使用以下方式查询此表:
SELECT color, box FROM boxes;
结果将类似于:
+-------+-----+
| color | box |
+-------+-----+
| blue | 2 |
| blue | 3 |
| blue | 4 |
| green | 1 |
| green | 3 |
| red | 1 |
| red | 2 |
| red | 2 |
+-------+-----+
是否可以以这样的方式查询此表:结果有两列,一列包含数组(或字符串或列表),每个不同的box
具有不同的color
值?
结果应该是这样的:
+-------+-----------+
| color | box_types |
+-------+-----------+
| blue | {2,3,4} |
| green | {1,3} |
| red | {1,2} |
+-------+-----------+
其中color
列必须包含唯一值,并且每行必须在聚合列中仅包含不同的box
个数字。
鉴于此问题的非不可知性,我想收集主要DBMS的所有最佳解决方案。在回答时,请指定每个查询的DBMS。
答案 0 :(得分:3)
好吧,在MySQL中你可以做到以下几点:
select color, group_concat(box) from tbl group by color
在Oracle中:
select color, wm_concat(box) from tbl group by color
答案 1 :(得分:3)
请尝试以下。
SELECT
color ,
STUFF(
(SELECT DISTINCT ',' +CONVERT(varchar(10), box)
FROM boxes
WHERE color = a.color
FOR XML PATH (''))
, 1, 1, '') AS box_types
FROM boxes AS a
GROUP BY color;
答案 2 :(得分:0)
首先,这是对“正常化”原则的否定,换言之,它是“坏”。
但是,有一些dbms,如Microsoft SQL Server,使用PIVOT(以及它相反的UNPIVOT)实现了这种可能性。
此子句允许创建一个表(使用您的示例),如下所示:
+-------+------+------+------+ | color | box1 | box2 | box3 | +-------+------+------+------+ | blue | 2 | 3 | 4 | | green | 1 | 3 | null | | red | 1 | 2 | null | +-------+------+------+------+