BigQuery关联表更新列报错解决:目标行匹配多行源行
解决BigQuery UPDATE报错:
UPDATE/MERGE must match at most one source row for each target row 这个报错的核心原因是BigQuery要求UPDATE/MERGE操作中,目标表(tableA)的每一行最多只能匹配到源表(tableB)的一行记录。虽然你的tableB里每个keyword对应唯一的vertical,但原语句的语法让BigQuery无法自动确认这一点,因此触发报错。
下面提供几种可行的解决方法:
方法1:给源表添加DISTINCT确保唯一性
通过DISTINCT明确告诉BigQuery,源表中的每个keyword只对应唯一的vertical,消除多匹配的疑虑:
UPDATE `tableA` AS tA SET tA.vertical = tB.vertical FROM (SELECT DISTINCT keyword, vertical FROM `tableB`) AS tB WHERE tA.query = tB.keyword;
方法2:使用标量子查询直接取值
跳过FROM子句的关联,直接对tableA的每一行查询对应的vertical值,这种方式天然保证单值匹配:
UPDATE `tableA` AS tA SET tA.vertical = ( SELECT vertical FROM `tableB` WHERE keyword = tA.query ) WHERE EXISTS ( SELECT 1 FROM `tableB` WHERE keyword = tA.query );
如果tableB存在同一keyword对应多个不同vertical的特殊情况,可以用MAX(vertical)或MIN(vertical)确保返回单值。
方法3:改用MERGE语句
MERGE语法同样可以实现更新,并且通过包装源表确保匹配的唯一性:
MERGE INTO `tableA` AS tA USING (SELECT DISTINCT keyword, vertical FROM `tableB`) AS tB ON tA.query = tB.keyword WHEN MATCHED THEN UPDATE SET vertical = tB.vertical;
以上三种方法都能让你得到期望的更新结果,根据自己的习惯选择即可。
内容的提问来源于stack exchange,提问作者Marhis
相关产品推荐
相关产品推荐

