使用外键连接没有唯一ID的表时避免重复

时间:2019-06-17 08:57:57

标签: sql join google-bigquery

我正面临这个问题,我真的不知道如何在连接两个表时处理重复的行。

我想加入两个表

Value_x表:

ID          Campaign      Value_x
foo         fb            1
foo         twitter       3
bar         fb            2
foobar      ads           2
foo         organic       3

Value_y表:

ID          Campaign      Value_y
foo         organic       42
foobar      organic       17
foo         ads           12
foo         twitter       23
bar         twitter       35

由于“广告系列”列,每个表中的ID都不唯一,例如,左联接表输出如下:

ID          t1.Campaign  t2.Campaign      Value_x  Value_y
foo         fb           organic          1        42
foo         fb           ads              1        12

理想情况下,我希望获得以下输出

ID          t1.Campaign  t2.Campaign      Value_x  Value_y
foo         fb           null             1        null
foo         twitter      twitter          3        23
foo         organic      organic          3        42
foo         null         ads              null     12

您将如何处理这种情况?我读了一些有关foreign keys的内容...我对这个概念不熟悉,它在这种情况下如何提供帮助?还是有办法在广告系列一级执行加入?

2 个答案:

答案 0 :(得分:2)

使用广告系列作为条件,看起来您想要 options:{ scales: { yAxes : [{ ticks : { max : 100, min : 0 } }] } } }

full outer join

答案 1 :(得分:2)

以下是用于BigQuery标准SQL

#standardSQL
SELECT ID,
  x.Campaign AS Campaign_x,
  y.Campaign AS Campaign_y,
  Value_x,
  Value_y
FROM `project.dataset.tableX` x
FULL OUTER JOIN `project.dataset.tableY` y
USING(ID, Campaign)

您可以使用问题中的示例数据来测试,玩转上面的示例

#standardSQL
WITH `project.dataset.tableX` AS (
  SELECT 'foo' ID, 'fb' Campaign, 1 Value_x UNION ALL
  SELECT 'foo', 'twitter', 3 UNION ALL
  SELECT 'bar', 'fb', 2 UNION ALL
  SELECT 'foobar', 'ads', 2 UNION ALL
  SELECT 'foo', 'organic', 3 
), `project.dataset.tableY` AS (
  SELECT 'foo' ID, 'organic' Campaign, 42 Value_y UNION ALL
  SELECT 'foobar', 'organic', 17 UNION ALL
  SELECT 'foo', 'ads', 12 UNION ALL
  SELECT 'foo', 'twitter', 23 UNION ALL
  SELECT 'bar', 'twitter', 35 
)
SELECT ID,
  x.Campaign AS Campaign_x,
  y.Campaign AS Campaign_y,
  Value_x,
  Value_y
FROM `project.dataset.tableX` x
FULL OUTER JOIN `project.dataset.tableY` y
USING(ID, Campaign)
-- ORDER BY ID    

有结果

Row ID      Campaign_x  Campaign_y  Value_x Value_y  
1   bar     fb          null        2       null     
2   bar     null        twitter     null    35   
3   foo     fb          null        1       null     
4   foo     twitter     twitter     3       23   
5   foo     organic     organic     3       42   
6   foo     null        ads         null    12   
7   foobar  ads         null        2       null     
8   foobar  null        organic     null    17