首页 > 解决方案 > BigQuery 在 WHERE 子句中的 WITH 子句下引用子查询

问题描述

基本上,我想将 WITH 子句中定义的ListOfIds子查询直接引用为单列表。例如,我想实现以下目标。

WITH
  ListOfIds AS (
  SELECT
    Id
  FROM
    ...)
SELECT
  *
FROM
  ...
WHERE
  Id IN ListOfIds

上述语法导致ListOfIds is not defined on Id IN ListOfIds行的错误

到目前为止,我能得到的最接近的是以下内容,我不喜欢它,因为它有些复杂和冗余的语法。

WITH
  ListOfIds AS (
  SELECT
    Id
  FROM
    ...)
SELECT
  *
FROM
  ...
WHERE
  Id IN (
  SELECT
    Id
  FROM
    ListOfIds)

提前感谢您的任何帮助或建议。

标签: google-bigquery

解决方案


首先是一个注释。你可能不想这样做。

CTE(WITH 查询)对于通常编码的人来说有点违反直觉,因为它感觉像是一个变量,但事实并非如此。实际发生的情况是,您多次运行查询来评估它,导致性能不佳并额外花费了 $$。

我建议你用一个简单的 JOIN 替换它,它会达到同样的效果,而且通常会更好。

基本上你的查询会是这样的:

WITH list_of_ids AS (
   SELECT id FROM table_with_ids
)

SELECT main_table.*
FROM main_table 
JOIN list_of_ids
   ON main_table.id = list_of_ids.id

我认为它的语法很简洁,可以解决您的问题。让我知道是否有我遗漏的东西,我可以补充。


推荐阅读