Nested

简介: Nested

嵌套类型,顾名思义是一种嵌套表结构。一张数据表,可以定义任意多个嵌套类型字段,但每个字段的嵌套层级只支持一级,即嵌套表内不能继续使用嵌套类型。对于简单场景的层级关系或关联关系,使用嵌套类型也是一种不错的选择。例如,下面的 nested_test 是一张模拟的员工表,它的所属部们就使用了嵌套类型:

$ CREATE TABLE nested_test (
  name String,
  age UInt8,
  dept Nested(
    id UInt8,
    name String
  )
) ENGINE = Memory;点击复制复制失败已复制


ClickHouse 的嵌套类型和传统的嵌套类型不同,导致在初次接触它的时候会让人十分困惑。以上面这张表为例,如果按照他的字面意思来理解,会很容易理解成 nested_testdept 是一对一的包含关系,其实这是错误的。做一个测试:

$ INSERT INTO nested_test VALUES ('nauu', 18, 10000, '研发部');
Exception on client:
Code: 53. DB::Exception: Type mismatch in IN or VALUES section. Expected: Array(UInt8). Got: UInt64点击复制复制失败已复制


分析上面的异常信息,它提示期望写入的是一个 Array 数组类型。


因此,嵌套类型的本质是一种多维数组的结构。嵌套表中的每个字段都是一个数组,并且行与行之间数组的长度无需对其。所以需要把刚才的 INSERT 语句调整成下面的形式:

$ INSERT INTO nested_test VALUES ('bruce', 30, [10000,10001,10002], ['研发部', '技术支持中心', '测试部']);
-- 行与行之间,数组长度无需对齐
$ INSERT INTO nested_test VALUES ('bruce', 30, [10000,10001], ['研发部', '技术支持中心']);点击复制复制失败已复制


注意

在同一行数据内的每个数组的元素个数必须相等


下面的示例中,由于行内数组字段的长度没有对齐,所以会抛出异常:

$ INSERT INTO nested_test VALUES ('bruce', 30, [10000, 100001], ['研发部', '技术支持中心', '测试部']);
Code: 190. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Elements 'dept.id' and 'dept.name' of Nested data structure 'dept' (Array columns) have different array sizes.. 点击复制复制失败已复制


在访问嵌套类型的数据时需要使用符号,例如:

$ SELECT name, dept.id, dept.name FROM nested_test;
┌─name──┬─dept.id────┬─dept.name──────────────────────────┐
│ bruce │ [16,17,18] │ ['研发部','技术支持中心','测试部']     │
└───────┴────────────┴────────────────────────────────────┘
┌─name──┬─dept.id─┬─dept.name─────────────────┐
│ bruce │ [16,17] │ ['研发部','技术支持中心']    │
└───────┴─────────┴───────────────────────────┘
目录
相关文章
|
4月前
|
JSON 关系型数据库 MySQL
EXPLAIN Join Types
`EXPLAIN` 输出的 `type` 列描述了表连接方式,从最优到最差包括:`system`(单行系统表)、`const`(最多一行,视为常量)、`eq_ref`(最佳连接类型,用于主键或唯一索引)、`ref`(基于索引的部分匹配)、`fulltext`(全文索引)、`ref_or_null`(包含 NULL 值的行)、`index_merge`(索引合并优化)、`unique_subquery` 和 `index_subquery`(索引查找替代子查询)、`range`(索引范围内检索)、`index`(索引扫描)、`ALL`(全表扫描,通常最差)。
|
5月前
|
SQL
[Err] 1052 - Column ‘roleId‘ in where clause is ambiguous
这篇文章解释了SQL查询中出现"Column ‘roleId’ in where clause is ambiguous"错误的原因,即在多表查询中,如果没有明确指定表名,相同的列名在where子句中会产生歧义,并提供了修正方法,即明确指定条件中所引用的列属于哪个表。
|
8月前
|
存储 JSON 数据格式
Nested嵌套对象类型还挺实用
Nested嵌套对象类型还挺实用
49 0
|
Java 数据库连接 数据库
Unable to evaluate the expression Method threw ‘org.hibernate.LazyInitializationException‘ exceptio
Unable to evaluate the expression Method threw ‘org.hibernate.LazyInitializationException‘ exceptio
|
SQL 缓存 Oracle
PostgreSQL 14中提升Nested Loop Joins性能的enable_memoize
PostgreSQL 14中提升Nested Loop Joins性能的enable_memoize
245 0
ORDER BY子句
ORDER BY子句
68 0
|
SQL 关系型数据库 MySQL
报错:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregat
报错:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregat
438 0
报错:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregat
|
SQL 存储 弹性计算
PostgreSQL sharding extensino citus 优化器 Query Processing 之 - Subquery/CTE Push-Pull Execution
标签 PostgreSQL , citus , sharding , push , pull , 优化器 背景 citus 是postgresql的sharding 开源中间件,2018年被微软收购,插件依旧开源。 在处理非常复杂的SQL时,CITUS使用推拉模型,支持跨节点的数据交换,用以处理复杂SQL。 中间结果的push,pull过程: push : shard ->
284 0
|
关系型数据库
|
Java 数据库连接 数据库

热门文章

最新文章