跳转到主要内容
merge 表函数可让我们并行查询多个表。 它通过创建一个临时的 Merge 表来实现,并通过对这些表的列取并集以及推导通用类型来确定该表的结构。

设置表

我们将借助 Jeff Sackmann 的网球数据集 学习如何使用这个函数。 我们将处理包含自 20 世纪 60 年代以来比赛数据的 CSV 文件,不过会为每个年代创建略有不同的 schema。 我们还会为 20 世纪 90 年代额外添加几列。 导入语句如下所示:

多个表的 schema

我们可以运行以下查询,并排列出每个表中的列及其类型,以便更直观地看出差异。
下面来看看这些差异:
  • 1970s 将 winner_seed 的类型从 Nullable(String) 改为 Nullable(UInt8),并将 scoreString 改为 Array(String)
  • 1980s 将 winner_seedloser_seed 的类型从 Nullable(UInt8) 改为 Nullable(UInt16)
  • 1990s 将 surfaceString 改为 Enum('Hard', 'Grass', 'Clay', 'Carpet'),并新增了 walkoverretirement 列。

使用 merge 查询多个表

让我们编写一个查询,找出 John McEnroe 战胜头号种子选手的比赛:
接下来,假设我们想对这些比赛记录进行过滤,找出其中 McEnroe 为 3 号种子或更低顺位的记录。 这会稍微麻烦一些,因为 winner_seed 在不同的表中使用了不同的类型:
我们使用 variantType 函数检查每一行中 winner_seed 的类型,再使用 variantElement 提取其底层值。 当类型为 String 时,我们会先将其转换为数值,再进行比较。 运行该查询后的结果如下所示:

使用 merge 时,这些行来自哪个表?

如果我们想知道这些行来自哪个表,可以怎么做? 我们可以使用 _table 虚拟列,如下查询所示:
我们也可以在查询中使用这个虚拟列,统计 walkover 列各个值的数量:
可以看到,除 atp_matches_1990s 外,其余所有数据的 walkover 列都为 NULL。 如果 walkover 列为 NULL,我们需要更新查询,检查 score 列是否包含字符串 W/O
如果 score 的底层类型是 Array(String),我们就必须遍历整个数组来查找 W/O;而如果它的类型是 String,则只需在字符串中搜索 W/O
最后修改于 2026年7月1日