连接另一个表的值列表中一个表的值

时间:2020-02-10 07:26:20

标签: sql join google-bigquery

在BigQuery中,我有table1,其中有一个(不可为空)列id,该列始终是5位整数。我想将其与table2一起加入,其中id还有一列id,这些列是这些相同ID的(可空)字符串。

麻烦的是,table2中的82795 82795 NULL 84660 84120 / 82795 73844 / 73845 73844 / 73845 NULL 83793 / 84758 73844 / 73845 / 84122 / 84136 73844 / 73845 / 84136 84845 也可能是'/'分隔ID的列表。

以下是该列的示例:

SELECT * FROM table1
LEFT JOIN table2
ON table1.id IN SPLIT(table2.id, ' / ')

如何用类似的逻辑实现某些目标:

promise

3 个答案:

答案 0 :(得分:1)

我同意Tim关于规范化表的说法,但是在此期间,您应该可以将INUNNEST一起使用来搜索SPLIT的结果:

SELECT * FROM table1
LEFT JOIN table2
ON table1.id IN UNNEST(SPLIT(table2.id, ' / '))

答案 1 :(得分:0)

您应该考虑标准化第二张表,以使每个react-router-dom值都出现在单独的记录中。作为当前情况的解决方法,您可以尝试以下操作:

id

上面的SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON CONCAT(' ', t2.id, ' ') LIKE CONCAT('% ', CAST(t1.id AS STRING), ' %'); 子句是一个技巧,可以在table2 ON中的某个地方搜索table1 id。它通过用空格填充后者来起作用,这样我们只需要搜索被空格包围的table1 id

答案 2 :(得分:0)

我同意尼克的说法,但我认为此版本在BigQuery中效果更好:

with table1 as (
       select 82795 as id union all
       SELECT 1234 UNION ALL
       SELECT 84122
     ),
     table2 as (
       SELECT '84120 / 82795' as id UNION ALL
       SELECT '73844 / 73845 / 84122 / 84136'
     )
SELECT t1, t2
FROM table1 t1 LEFT JOIN 
     (table2 t2 CROSS JOIN
      UNNEST(SPLIT(t2.id, ' / ')) t2id
     )
     ON t1.id = safe_cast(t2id as int64);

(上面的作品。)

注意:

  • 我不为=使用LEFT JOIN时,BigQuery抱怨。
  • 我假设table1.id是一个数字。需要转换字符串以进行比较。
  • SELECT中不允许使用重复的列名,因此SELECT *不起作用。一种简单的解决方法是将值选择为记录而不是列。