尝试合并包含联接操作的 2 个子查询时,BigQuery 联合失败

Posted

技术标签:

【中文标题】尝试合并包含联接操作的 2 个子查询时,BigQuery 联合失败【英文标题】:BigQuery union is failing when trying to union 2 subqueries that include join operation 【发布时间】:2015-12-18 23:47:12 【问题描述】:

我们正在尝试合并 2 个子查询并出现错误。 这是查询:

select *
from
(select  TRANS_SEQ, TRANS_TS
from [X.ls_transaction] ls
left join each (select * from [X.resident_s] where date(eff_end_ts) = date('9999-12-31')) rs on ls.source_resident_key=rs.resident_key
where date(trans_ts) = date('2015-07-31')) a,
(select TRANS_SEQ, TRANS_TS,
from [X.ld_transaction] ld
left join each (select * from [X.resident_d] where date(eff_end_ts) = date('9999-12-31')) rs on ld.source_resident_key=rs.resident_key
where date(trans_ts) = date('2015-07-31')) b
limit 1;

这是它返回的错误:

错误:联合导致模式不明确。 [TRANS_SEQ] 不明确且 正在给多个字段起别名。别名字段: ld.TRANS_SEQ,ls.TRANS_SEQ,

如果我从子查询中取出两个连接,则联合工作。 这是一个错误吗?

谢谢

【问题讨论】:

【参考方案1】:

您很可能在 X.resident_d 和 X.resident_s 中有 TRANS_SEQ 字段,这会引入歧义。 您应该执行以下操作

select *
from
(select ls.TRANS_SEQ as TRANS_SEQ, TRANS_TS
from [X.ls_transaction] ls
left join each (select * from [X.resident_s] where date(eff_end_ts) = date('9999-12-31')) rs on ls.source_resident_key=rs.resident_key
where date(trans_ts) = date('2015-07-31')) a,
(select ld.TRANS_SEQ as TRANS_SEQ, TRANS_TS,
from [X.ld_transaction] ld
left join each (select * from [X.resident_d] where date(eff_end_ts) = date('9999-12-31')) rs on ld.source_resident_key=rs.resident_key
where date(trans_ts) = date('2015-07-31')) b
limit 1;

【讨论】:

【参考方案2】:

尝试为两个“TRANS_SEQ”变量中的第二个变量指定一个不同的名称并使用合并函数。以下是我解决此问题的方法:

select coalesce (TRANS_SEQ, TRANS_SEQ_b)
from
(select  TRANS_SEQ, TRANS_TS
from [X.ls_transaction] ls
left join each (select * from [X.resident_s] where date(eff_end_ts) = date('9999-12-31')) rs on ls.source_resident_key=rs.resident_key
where date(trans_ts) = date('2015-07-31')) a,
(select TRANS_SEQ as TRANS_SEQ_b , TRANS_TS,
from [X.ld_transaction] ld
left join each (select * from [X.resident_d] where date(eff_end_ts) = date('9999-12-31')) rs on ld.source_resident_key=rs.resident_key
where date(trans_ts) = date('2015-07-31')) b
limit 1;

我已经测试过了,它可以工作。

【讨论】:

以上是关于尝试合并包含联接操作的 2 个子查询时,BigQuery 联合失败的主要内容,如果未能解决你的问题,请参考以下文章

联接 (SQL Server)

数据库(比如MYSQL) ,表连结查询与子查询哪个效率高些? 为啥

如何编写没有联接的 JPA 2.1 更新条件查询?

如何编写包含联接、更新和排序的查询?

sql [BigQuery - Facebook产品目录]查询para obtenerelcatálogodeproductos de Kichink。 #facebook #bigqu

在单个查询中使用多个联接