You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery使用LIKE更新表触发UPDATE/MERGE单源行匹配错误问题咨询

问题原因

你遇到的两类报错对应以下两个问题:

  • Alias table1 in the FROM clause was already defined as the UPDATE target:BigQuery 的 UPDATE 语法中,目标表已经作为默认操作对象,不需要在 FROM 子句中重复声明,否则会触发别名冲突。
  • UPDATE/MERGE must match at most one source row for each target row:单行 table1 数据匹配到了多行 table2 的映射项,可能的触发场景包括 table2 存在重复映射值、单条文本命中多个不同关键词,系统无法确定取哪个值更新,因此报错。
适配场景的解决方案

以下语句兼容两表存在重复值、单文本命中多关键词的需求:

方案1:支持多关键词逗号拼接返回

如果需要把单条文本命中的所有不同关键词都返回,用逗号分隔,使用如下语句:

UPDATE `你的项目ID.你的数据集名.table1` t1
SET foundItem = (
  SELECT STRING_AGG(DISTINCT mt.mappingItem, ', ')
  FROM `你的项目ID.你的数据集名.table2` mt
  WHERE t1.textWithFoundItemInIt LIKE CONCAT('%', mt.mappingItem, '%')
)
WHERE TRUE;

逻辑说明:

内层子查询针对每一行 table1 的文本,先对匹配到的映射项去重,再拼接为单个字符串,保证每个 table1 行只返回唯一的更新值,完全规避单行多匹配报错。如果只有一个匹配项,返回结果就是单个关键词,和你给出的预期结果完全一致。

方案2:仅返回任意一个匹配的关键词

如果不需要多值返回,只要匹配到的任意一个关键词即可,使用如下语句:

UPDATE `你的项目ID.你的数据集名.table1` t1
SET foundItem = (
  SELECT mt.mappingItem
  FROM `你的项目ID.你的数据集名.table2` mt
  WHERE t1.textWithFoundItemInIt LIKE CONCAT('%', mt.mappingItem, '%')
  LIMIT 1
)
WHERE TRUE;

逻辑说明:

用LIMIT 1限制每个 table1 行仅匹配到第一个符合条件的映射项,直接解决单行多匹配的报错问题,映射表中的重复值不会影响执行结果。

内容的提问来源于stack exchange,提问作者Frank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:24:04