Google bigquery BigQuery:不支持引用其他表的相关子查询,除非它们可以取消相关

Google bigquery BigQuery:不支持引用其他表的相关子查询,除非它们可以取消相关,google-bigquery,Google Bigquery,在实际表上运行查询时,会出现以下错误: 不支持引用其他表的相关子查询,除非它们可以取消相关,例如通过将它们转换为有效的联接 以下是我正在运行的确切查询: SELECT CASE WHEN addresses LIKE '%,%' THEN ( SELECT STRING_AGG(DISTINCT address) addresses FROM VW_CLEAN.TABLE_1 WHERE member_id = el.member_id AND eligible_month < el.el

在实际表上运行查询时,会出现以下错误:

不支持引用其他表的相关子查询,除非它们可以取消相关,例如通过将它们转换为有效的联接

以下是我正在运行的确切查询:

SELECT
CASE WHEN addresses LIKE '%,%'
THEN
(
SELECT STRING_AGG(DISTINCT address) addresses
FROM VW_CLEAN.TABLE_1
WHERE member_id = el.member_id
AND eligible_month < el.eligible_month
GROUP BY member_id, eligible_month
ORDER BY eligible_month DESC 
LIMIT 1
) 
END AS address,
eligible_month, 
member_id
FROM
(
    SELECT STRING_AGG(DISTINCT address) addresses, eligible_month, member_id FROM
    (
        SELECT DISTINCT address, eligible_month, member_id
        FROM VW_CLEAN.TABLE_1
        UNION ALL
        SELECT DISTINCT address, eligible_month, member_id
        FROM VW_CLEAN.TABLE_2
    )
    GROUP BY eligible_month, member_id
) el
WHERE member_id IS NOT NULL
AND eligible_month IS NOT NULL
但是,当我准备相同的查询时,但对于使用WITH AS的测试数据,它运行时没有错误

#standardSQL
WITH table_1 AS (
  SELECT "201905" AS month, "11111" AS member, "123" AS address
  UNION ALL
  SELECT "201903" AS month, "11111" AS member, "234" AS address
  UNION ALL
  SELECT "201902" AS month, "11111" AS member, "345" AS address
  UNION ALL
  SELECT "201902" AS month, "22222" AS member, "456" AS address
  UNION ALL
  SELECT "201901" AS month, "22222" AS member, "567" AS address
),
table_2 AS (
  SELECT "201904" AS month, "11111" AS member, "678" AS address
)

SELECT 
a.member,
a.month,
(
  SELECT STRING_AGG(address) address
  FROM table_1
  WHERE member = a.member
  AND month < a.month
  GROUP BY member, month
  ORDER BY month DESC 
  LIMIT 1
) AS previous_address
FROM
(
    SELECT STRING_AGG(address) address, month, member
    FROM
    (
        SELECT month, member, address
        FROM table_1
        UNION ALL
        SELECT month, member, address
        FROM table_2
    )
    GROUP BY month, member
    HAVING member = '11111' AND month = '201905'
) a
那么,实际表和使用AS创建的表之间有什么区别呢


编辑器需要更多的文本来保存描述,因此我正在添加文本文本文本文本文本文本,但是我不知道您的问题的确切答案,我可以说,您的查询不是最佳实践之一

我想了解更多关于table1和table2的信息,以获得更好的查询,但现在,我将把它作为一个表来处理,以获取成员以前的地址

因此,您可以使用窗口函数获取用户的上一个值。 我为您准备了一个示例查询,如果您能提供有关表和用途的更多详细信息,我可以让它变得更好

WITH table_1 AS (
  SELECT "201905" AS month, "11111" AS member, "123" AS address
  UNION ALL
  SELECT "201903" AS month, "11111" AS member, "234" AS address
  UNION ALL
  SELECT "201902" AS month, "11111" AS member, "345" AS address
  UNION ALL
  SELECT "201902" AS month, "22222" AS member, "456" AS address
  UNION ALL
  SELECT "201901" AS month, "22222" AS member, "567" AS address
),
table_2 AS (
  SELECT "201904" AS month, "11111" AS member, "678" AS address
)
SELECT 
  *,
  lag(address) over (partition by member order by month) previous_address,
  last_value(t1_address ignore nulls) over (partition by member order by month rows between unbounded preceding and 1 preceding) as previous_t1_address
FROM 
(
    SELECT month, member, address, address as t1_address
    FROM table_1
    UNION ALL
    SELECT month, member, address, null
    FROM table_2
);

根据文件

FROM子句别名对于同一FROM中的子查询不可见 条款FROM子句中的子查询不能包含相关的 对同一FROM子句中其他表的引用

在您的情况下,您正在使用字段el.member_id和el.qualified_month,并且根据上面提到的消息,表el对子查询不可见

在中,您可以找到有关无效关联子查询的更多示例


但是,最佳实践应该是WITH语句。

我在描述中添加了我正在运行的确切查询。请看一看并提供帮助,谢谢。问题是你不应该在BigQuery中使用相关查询。这是个坏习惯。BigQuery不是为这种用途而设计的。此外,对于您的用例,即使在其他数据库引擎中,相关查询也不是最好的方法。有一些窗口函数可以解决您的问题,您应该使用它们。为什么不使用上面的查询?它已经按预期工作了,如果没有,我们可以修复它。只需为您的问题提供输入和输出数据。el子查询的结果可能类似于:地址:address1,address2成员:11111符合条件的月:201906。因此,当我在地址中获得类似%,%的结果时,我想获取上个月的地址。但前一个月并不总是201905,甚至可能是201802。假设此成员的上一条记录是:addresses:address3 member:11111 Qualified_month:201802,那么整个查询的输出应该是:addresses:address3 member:11111 Qualified_month:201906您尝试过我的查询吗?它在哪里失败?这正是你想要的。