ClickHouse 中的公共表表达式CTE

请添加图片描述

什么是公共表表达式(CTE) ?在本文中,学习如何在 ClickHouse 数据库中使用 CTE,并通过示例跟踪用例

在下列情况下使用 CTE 很方便:

  • 当一个请求可以获得数据,并且其大小适合内存空间时
  • 需要多次使用此查询的结果
  • 创建递归查询

额外的好处是提高了 SQL 查询的可读性。

CTE 与临时表和嵌套查询之间的区别是什么?

  • 如果子查询是相关的,那么它的调用将针对选定内容中的每一行重复,从而显著增加执行此查询的成本。
  • 用大量数据填充临时表会在磁盘上造成负载。
  • 由于存储临时表的特殊性,使用临时表执行查询会增加执行时间。

语法

ClickHouse 既支持 WITH< 表达式 > AS < 标识符 > ,也支持 WITH< 标识符 > AS < 子查询表达式 > 语法。

  • 使用 WITH 初始化 CTE。
  • 为查询提供名称。
  • 接着是 AS。
  • 定义查询
  • 如果需要多个 CTE,请用逗号分隔它们。
WITH locations AS
    (
        SELECT location
        FROM table
        WHERE date > (today() - 10)
    )
SELECT *
FROM locations
  • 使用 WITH 初始化 CTE。
  • 定义一个表达方式
  • 接着是 AS。
  • 为表达式提供名称。
  • 如果需要多个 CTE,请用逗号分隔它们。
WITH ('USA', 'BRA') AS locations
SELECT 'ARG' IN (locations)

例子

建表:

CREATE TABLE SpareParts
(
    `id` UInt32,
    `partName` String,
    `partOrigin` String,
    `storeID` UInt32
)
ENGINE = MergeTree()
ORDER BY id

插入:

INSERT INTO SpareParts VALUES (1, 'headlight', 'USA', 1)
INSERT INTO SpareParts VALUES (2, 'hood', 'JPN', 1)
INSERT INTO SpareParts VALUES (3, 'bumper', 'USA', 1)
INSERT INTO SpareParts VALUES (4, 'radiator', 'BRA', 3)
INSERT INTO SpareParts VALUES (5, 'wheel', 'BRA', 2)
INSERT INTO SpareParts VALUES (6, 'stabilizer', 'ARG', 3)
INSERT INTO SpareParts VALUES (7, 'absorber', 'TUR', 2)
INSERT INTO SpareParts VALUES (8, 'cable', 'MEX', 1)
INSERT INTO SpareParts VALUES (9, 'spring', 'MEX', 3)
INSERT INTO SpareParts VALUES (10, 'door', 'USA', 2)

选择:

WITH
    originsByStore AS
    (
        SELECT
            storeID,
            groupArray(partOrigin) AS origins
        FROM SpareParts
        GROUP BY storeID
    ),
    partsByStore AS
    (
        SELECT
            storeID,
            groupArray(partName) AS partNames
        FROM SpareParts
        GROUP BY storeID
    ),
    has(origins, 'USA') = 1 AS isUSA
SELECT
    storeID,
    origins,
    partNames,
    isUSA
FROM originsByStore AS t1
LEFT JOIN
(
    SELECT
        storeID,
        partNames
    FROM partsByStore
) AS t2 USING (storeID)

结果:

Result

博主个人博客网站:https://www.beierblog.com

本文原创作者:奇想派、一名努力分享的程序员。

文章首发平台:微信公众号【编程达人】

qrcode_for_gh_ef30b7fd9e6f_344

原创不易!各位小伙伴觉得文章不错的话,不妨关注公众号,进行点赞(在看)、转发三连走起!谢谢大家!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奇怪的守护神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值