优化检查其他列中是否有任何数组值的 SQL Cross Join

问题描述

假设我有一个带有结构的表 events

id value_array
XXXX [a,b,c,d]
... ...

我有第二个表 values_of_interest 的结构:

价值
x
y
z

我想找到具有在 values_of_interest 中找到的任何值的 ID。在其他条件相同的情况下,实现这一目标的性能最高的 SQL 是什么? (我正在使用 BigQuery,但可以更一般地回答)

我目前的想法是:

SELECT 
  DISTINCT e.id 
FROM 
  events e,values_of_interest vi 
WHERE 
  EXISTS(
     SELECT 
       value 
     FROM
       UNNEST(e.value_array) value 
     JOIN 
       vi ON vi.value = e.value 
        )

解决方法

BigQuery Standard SQL 的几个快速选项

选项 1

select id
from `project.dataset.events`
where exists (
  select 1
  from `project.dataset.values_of_interest` 
  where value in unnest(value_array)
)     

选项 2

select id
from `project.dataset.events` t
where (
  select count(1)
  from t.value_array as value
  join `project.dataset.values_of_interest`
  using(value)
) > 0
,

我会用 existsjoin 来写:

select e.id
from `project.dataset.events` e
where exists (select 1
              from unnest(e.value_array) val join
                   `project.dataset.values_of_interest` voi
                   on val = voi.value
             );
 

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...