具有硬编码值的子查询的LEFT OUTER JOIN错误

问题描述

我在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的形式。

我需要通过找到对应的行来匹配来自table2table1中的交易的数据,在该行中管道分隔的字符串中存在帐户ID,并且交易日期介于开始日期之间和结束日期。

我通过使用允许我应用这些条件的子查询解决此问题,这对于从table2中选择大多数字段都适用。但是,当我尝试选择category字段(在我的WITH语句中硬编码)时,我收到有关左外部联接的错误

我需要具有此硬编码值,categoryData中的查询将扩展为多个表的UNION,每个表具有不同的类别值。

是什么原因导致此错误,我该如何解决?还是总体上有更好的方法

编辑:添加样本数据。

表1:

enter image description here

表2:

enter image description here

所需结果:

enter image description here

解决方法

我相信您相关的子查询正在作为左联接,并且由于您正在将日期与>=<=(不等式)进行比较,因此您会看到此错误消息。

我会这样处理:

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}}的开始/结束日期有重叠

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...