ClickHouse 中的公共表表达式 CTE

本贴最后更新于 647 天前,其中的信息可能已经时移世易

什么是公共表表达式(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 **

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
whimsy
喜欢技术,主语言java,兼顾会python、go、javascript、shell、flutter。喜欢自己折腾产品,十年技术架构师,前后端运维高速搬运工程师。 东莞