Sql 大查询:当一个表包含用户ID数组时,如何连接用户ID上的两个表?

Sql 大查询:当一个表包含用户ID数组时,如何连接用户ID上的两个表?,sql,arrays,google-bigquery,inner-join,Sql,Arrays,Google Bigquery,Inner Join,StackOverflow上已经发布了一些类似的答案,但它们并没有针对这个特定的案例,或者涉及到一个我无法理解的查询,因为我刚刚开始了我的第一个SQL相关职位 这是我第一次尝试以数组的形式连接在其中一个表中具有列值的表。在尝试解决我自己的问题后,我遇到了以下错误:运算符没有匹配的签名=对于参数类型:数组、字符串 我有两个表,如下所示: 表1: team_id user_id 1 [1, 2, 3] 2 [4, 5, 6] 3 [7,

StackOverflow上已经发布了一些类似的答案,但它们并没有针对这个特定的案例,或者涉及到一个我无法理解的查询,因为我刚刚开始了我的第一个SQL相关职位

这是我第一次尝试以数组的形式连接在其中一个表中具有列值的表。在尝试解决我自己的问题后,我遇到了以下错误:
运算符没有匹配的签名=对于参数类型:数组、字符串

我有两个表,如下所示:

表1:

team_id     user_id
   1       [1, 2, 3]
   2       [4, 5, 6]
   3       [7, 8, 9]
   4      [10, 11, 12]
表2:

user_id    value
   2         10
   5         20
   7         30
   12        40
我想通过让表2分析表1的数组中是否有匹配的用户id,将表2连接到表1。如果有,则基于公共用户id加入,并输出如下结果:

期望输出

team_id  user_id  value
1          2       10
2          5       20
3          7       30
4          12      40

提前感谢您分享您的知识

您可以在
unnest()上加入:


您可以在
unest()上加入:


下面是BigQuery标准SQL

#standardSQL
SELECT team_id, 
  ARRAY_AGG(t2.user_id IGNORE NULLS) user_id,
  IFNULL(SUM(value), 0) value
FROM `project.dataset.table1` t, t.user_id AS user_id
LEFT JOIN `project.dataset.table2` t2
USING(user_id)
GROUP BY team_id
您可以使用与您的示例数据类似的示例数据测试、播放上述内容,如下例所示

#standardSQL
WITH `project.dataset.table1` AS (
  SELECT 1 team_id, [1, 2, 3] user_id UNION ALL
  SELECT 2, [4, 5, 6] UNION ALL
  SELECT 3, [7, 8, 9] UNION ALL
  SELECT 4, [10, 11, 12] UNION ALL
  SELECT 5, [13, 14]
), `project.dataset.table2` AS (
  SELECT 2 user_id, 10 value UNION ALL
  SELECT 3, 20 UNION ALL
  SELECT 5, 20 UNION ALL
  SELECT 7, 30 UNION ALL
  SELECT 9, 1 UNION ALL
  SELECT 12, 40 
)
SELECT team_id, 
  ARRAY_AGG(t2.user_id IGNORE NULLS) user_id,
  IFNULL(SUM(value), 0) value
FROM `project.dataset.table1` t, t.user_id AS user_id
LEFT JOIN `project.dataset.table2` t2
USING(user_id)
GROUP BY team_id    
有输出


下面是BigQuery标准SQL

#standardSQL
SELECT team_id, 
  ARRAY_AGG(t2.user_id IGNORE NULLS) user_id,
  IFNULL(SUM(value), 0) value
FROM `project.dataset.table1` t, t.user_id AS user_id
LEFT JOIN `project.dataset.table2` t2
USING(user_id)
GROUP BY team_id
您可以使用与您的示例数据类似的示例数据测试、播放上述内容,如下例所示

#standardSQL
WITH `project.dataset.table1` AS (
  SELECT 1 team_id, [1, 2, 3] user_id UNION ALL
  SELECT 2, [4, 5, 6] UNION ALL
  SELECT 3, [7, 8, 9] UNION ALL
  SELECT 4, [10, 11, 12] UNION ALL
  SELECT 5, [13, 14]
), `project.dataset.table2` AS (
  SELECT 2 user_id, 10 value UNION ALL
  SELECT 3, 20 UNION ALL
  SELECT 5, 20 UNION ALL
  SELECT 7, 30 UNION ALL
  SELECT 9, 1 UNION ALL
  SELECT 12, 40 
)
SELECT team_id, 
  ARRAY_AGG(t2.user_id IGNORE NULLS) user_id,
  IFNULL(SUM(value), 0) value
FROM `project.dataset.table1` t, t.user_id AS user_id
LEFT JOIN `project.dataset.table2` t2
USING(user_id)
GROUP BY team_id    
有输出


如果表2中有多个用户与表1中的团队id匹配,该怎么办?@MikhailBerlyant我目前正在尝试实现发布的答案,但如果您有时间,我希望看到如何加入表,以防表2中有多个用户与表1中的团队id匹配
我希望看到如何…
-当然。看看我的答案。考虑一下投票吧,如果它有帮助的话:O。感谢您一如既往地分享您的知识。我会很快回复你如果表2的多个用户与表1中的团队id匹配怎么办?@MikhailBerlyant我目前正在尝试实现发布的答案,但如果你有时间,我想看看如何加入表,以防表2的多个用户与表1中的团队id匹配我想看看如何…
-当然。看看我的答案。考虑一下投票吧,如果它有帮助的话:O。感谢您一如既往地分享您的知识。我会很快回复你的Mikhail,谢谢你的例子!正如我所承诺的,我今天花了一些时间来阅读这段代码并真正理解它。了解我以前从未使用过的IFNULL()函数非常有帮助,现在我知道它用于避免查询中基于零的错误。我还注意到,您添加了一个额外的角落案例,说明如何处理在另一个表中找不到user_id的情况。你总是第一个回答我的问题,谢谢你!我从您的示例中注意到,即使我有一个用于公共列的数组,联接语法也不会改变!正如我所承诺的,我今天花了一些时间来阅读这段代码并真正理解它。了解我以前从未使用过的IFNULL()函数非常有帮助,现在我知道它用于避免查询中基于零的错误。我还注意到,您添加了一个额外的角落案例,说明如何处理在另一个表中找不到user_id的情况。你总是第一个回答我的问题,谢谢你!我从您的示例中注意到,即使我有一个用于公共列的数组,联接语法也不会改变。