嵌套
Nested(name1 Type1, Name2 Type2, ...)
嵌套数据结构就像单元格内部的一个表。嵌套数据结构的参数(列名和类型)与CREATE TABLE查询中的参数相同。每个表行可以对应嵌套数据结构中的任意数量的行。
示例
CREATE TABLE test.visits
(
CounterID UInt32,
StartDate Date,
Sign Int8,
IsNew UInt8,
VisitID UInt64,
UserID UInt64,
...
Goals Nested
(
ID UInt32,
Serial UInt32,
EventTime DateTime,
Price Int64,
OrderID String,
CurrencyID UInt32
),
...
) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)
此示例声明了Goals
嵌套数据结构,其中包含有关转换(达成的目标)的数据。‘visits’表中的每一行都可以对应于零个或任意数量的转换。
当flatten_nested设置为0
(默认情况下不是)时,支持任意级别的嵌套。
在大多数情况下,当使用嵌套数据结构时,其列由用点分隔的列名指定。这些列构成一个匹配类型的数组。单个嵌套数据结构的所有列数组具有相同的长度。
示例
SELECT
Goals.ID,
Goals.EventTime
FROM test.visits
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10
┌─Goals.ID───────────────────────┬─Goals.EventTime───────────────────────────────────────────────────────────────────────────┐
│ [1073752,591325,591325] │ ['2014-03-17 16:38:10','2014-03-17 16:38:48','2014-03-17 16:42:27'] │
│ [1073752] │ ['2014-03-17 00:28:25'] │
│ [1073752] │ ['2014-03-17 10:46:20'] │
│ [1073752,591325,591325,591325] │ ['2014-03-17 13:59:20','2014-03-17 22:17:55','2014-03-17 22:18:07','2014-03-17 22:18:51'] │
│ [] │ [] │
│ [1073752,591325,591325] │ ['2014-03-17 11:37:06','2014-03-17 14:07:47','2014-03-17 14:36:21'] │
│ [] │ [] │
│ [] │ [] │
│ [591325,1073752] │ ['2014-03-17 00:46:05','2014-03-17 00:46:05'] │
│ [1073752,591325,591325,591325] │ ['2014-03-17 13:28:33','2014-03-17 13:30:26','2014-03-17 18:51:21','2014-03-17 18:51:45'] │
└────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘
最简单的理解方式是将嵌套数据结构视为一组具有相同长度的多个列数组。
SELECT 查询中唯一可以指定整个嵌套数据结构名称(而不是单个列)的地方是ARRAY JOIN子句。有关更多信息,请参阅“ARRAY JOIN子句”。示例
SELECT
Goal.ID,
Goal.EventTime
FROM test.visits
ARRAY JOIN Goals AS Goal
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10
┌─Goal.ID─┬──────Goal.EventTime─┐
│ 1073752 │ 2014-03-17 16:38:10 │
│ 591325 │ 2014-03-17 16:38:48 │
│ 591325 │ 2014-03-17 16:42:27 │
│ 1073752 │ 2014-03-17 00:28:25 │
│ 1073752 │ 2014-03-17 10:46:20 │
│ 1073752 │ 2014-03-17 13:59:20 │
│ 591325 │ 2014-03-17 22:17:55 │
│ 591325 │ 2014-03-17 22:18:07 │
│ 591325 │ 2014-03-17 22:18:51 │
│ 1073752 │ 2014-03-17 11:37:06 │
└─────────┴─────────────────────┘
您无法对整个嵌套数据结构执行SELECT。您只能显式列出构成其一部分的各个列。
对于INSERT查询,您应该分别传递嵌套数据结构的所有组件列数组(就像它们是单独的列数组一样)。在插入过程中,系统会检查它们是否具有相同的长度。
对于DESCRIBE查询,嵌套数据结构中的列以相同的方式分别列出。
嵌套数据结构中元素的ALTER查询有一些限制。