问题描述
我在BigQuery中遇到以下错误,并且不知道如何解决该错误:“如果没有联接两端的字段相等的条件,则无法使用LEFT OUTER JOIN。”
我的查询如下所示:
WITH salesData AS (
SELECT
account_id,date,amount
FROM
table1
),categoryData AS (
SELECT
'Category1' AS category,SPLIT(accountIds,'|') AS accountIds,name,startDate,endDate
FROM
table2
)
SELECT
salesData.*,(
SELECT
name
FROM
categoryData
WHERE
salesData.date >= startDate
AND
salesData.date <= endDate
AND
salesData.account_id IN UNnesT(accountIds)
) AS client_name,(
SELECT
category
FROM
categoryData
WHERE
salesData.date >= startDate
AND
salesData.date <= endDate
AND
salesData.account_id IN UNnesT(accountIds)
) AS category,FROM
salesData
第一个表table1
包含有关一系列交易的数据,其中account_id
字段代表销售收入的帐户。
第二张表table2
包含有关这些帐户的数据-该数据随时间变化,因此每条记录都有一个关联的开始和结束日期-关联数据的有效期限。每个记录可能都适用于多个帐户,因此字段accountIds
采用以管道分隔的ID的形式。
我需要通过找到对应的行来匹配来自table2
和table1
中的交易的数据,在该行中管道分隔的字符串中存在帐户ID,并且交易日期介于开始日期之间和结束日期。
我通过使用允许我应用这些条件的子查询来解决此问题,这对于从table2
中选择大多数字段都适用。但是,当我尝试选择category
字段(在我的WITH
语句中硬编码)时,我收到有关左外部联接的错误。
我需要具有此硬编码值,categoryData
中的查询将扩展为多个表的UNION,每个表具有不同的类别值。
是什么原因导致此错误,我该如何解决?还是总体上有更好的方法?
编辑:添加样本数据。
表1:
表2:
所需结果:
解决方法
我相信您相关的子查询正在作为左联接,并且由于您正在将日期与>=
和<=
(不等式)进行比较,因此您会看到此错误消息。
我会这样处理:
with salesData as (
select account_id,date,amount from table1
),categoryData as (
select 'Category1' as category,account_id,name,startDate,endDate
from table2
left join unnest(split(accountIDs,'|')) account_id
)
select
account_id,amount,category
from salesData
left join categoryData using(account_id)
where date between startDate and endDate
此外,我认为您的table2
的{/ {1}}的开始/结束日期有重叠