BigQuery内连接更新失败但子查询更新成功的原因咨询
BigQuery UPDATE内连接报错与子查询成功的原因分析
错误核心原因
虽然你认为transaction_header_guid是唯一值,但问题出在源表(documents_bkup)中该字段可能不唯一——内连接时,目标表(transactions_bkup)的单一行会匹配到源表的多行数据,而BigQuery的UPDATE规则强制要求:目标表的每一行只能对应源表的最多一行,否则无法确定用哪一行数据来更新,直接触发报错。
两种写法的差异解析
- 内连接UPDATE的问题
假设你的内连接写法类似:
UPDATE dde-demo-d001.sap_crm.transactions_bkup t SET t.target_column = d.source_column FROM dde-demo-d001.sap_crm.documents_bkup d WHERE t.transaction_header_guid = d.transaction_header_guid
如果documents_bkup里存在同一transaction_header_guid对应多行的情况,内连接后目标表的一行会关联到源表的多条记录,BigQuery无法抉择更新值,因此报错。
- 子查询成功的逻辑
你的子查询写法必然隐含了确保单一行匹配的逻辑,比如用LIMIT 1或者聚合函数(MAX()/MIN())来限制每个guid只返回一行数据,示例如下:
UPDATE dde-demo-d001.sap_crm.transactions_bkup t SET t.target_column = ( SELECT d.source_column FROM dde-demo-d001.sap_crm.documents_bkup d WHERE d.transaction_header_guid = t.transaction_header_guid LIMIT 1 -- 或用聚合函数确保唯一返回值 ) WHERE EXISTS ( SELECT 1 FROM dde-demo-d001.sap_crm.documents_bkup d WHERE d.transaction_header_guid = t.transaction_header_guid )
这种写法通过子查询的限制,保证每个目标行最多匹配到一个源行值,符合BigQuery的UPDATE规则,因此能成功执行。
验证方法
执行以下查询,检查documents_bkup中transaction_header_guid的唯一性:
SELECT transaction_header_guid, COUNT(*) AS row_count FROM dde-demo-d001.sap_crm.documents_bkup GROUP BY transaction_header_guid HAVING row_count > 1
如果返回结果,说明该字段在源表中存在重复值,这就是内连接报错的根本原因。
内容的提问来源于stack exchange,提问作者Jaango Jayaraj
相关产品推荐
相关产品推荐

