首页 > 解决方案 > 我可以在 Google BigQuery 中对 3 个不同的表进行完全外部联接吗

问题描述

SELECT * 
FROM `project.dataset1.table1` t1  
FULL OUTER JOIN `project.dataset2.table2` t2 
USING (Name) 
FULL OUTER JOIN `project.dataset3.table3` t3 
USING (Name) 
WHERE Name LIKE '%John%'

project.dataset1.table1并且project.dataset3.table3两者都具有相同的列名。

我收到错误“不支持结果中的重复列名”。

在 BigQuery 中组合这些表的正确方法是什么?

标签: google-bigquery

解决方案


让我先解释一下这里发生了什么

在下面的示例中 - 重复的列名没有问题,而不是Name但是通过在USING()vs中包含 Name 来解决ON

#standardSQL 
WITH 
  `project.dataset1.table1` AS (SELECT 'John' Name, 'a' x ),  
  `project.dataset2.table2` AS (SELECT 'John' Name, 'b' y),  
  `project.dataset3.table3` AS (SELECT 'John' Name, 'c' z)
SELECT * 
FROM `project.dataset1.table1` t1  
FULL OUTER JOIN `project.dataset2.table2` t2 USING (Name) 
FULL OUTER JOIN `project.dataset3.table3` t3 USING (Name) 
WHERE Name LIKE '%John%'   

在下面的第二个示例中,您会看到重复的额外字段dup_col(在 table1 和 table2 中) - 因此错误 -Duplicate column names in the result are not supported

#standardSQL 
WITH 
  `project.dataset1.table1` AS (SELECT 'John' Name, 'a' x, 'qq' dup_col),  
  `project.dataset2.table2` AS (SELECT 'John' Name, 'b' y, 'ww' dup_col),  
  `project.dataset3.table3` AS (SELECT 'John' Name, 'c' z)
SELECT * 
FROM `project.dataset1.table1` t1  
FULL OUTER JOIN `project.dataset2.table2` t2 USING (Name) 
FULL OUTER JOIN `project.dataset3.table3` t3 USING (Name) 
WHERE Name LIKE '%John%'   

最后,在下面的示例中,您将找到解决该问题的方法

#standardSQL 
WITH 
  `project.dataset1.table1` AS (SELECT 'John' Name, 'a' x, 'qq' dup_col),  
  `project.dataset2.table2` AS (SELECT 'John' Name, 'b' y, 'ww' dup_col),  
  `project.dataset3.table3` AS (SELECT 'John' Name, 'c' z)
SELECT * EXCEPT(dup_col), 
  t1.dup_col AS t1_dup_col, 
  t2.dup_col AS t2_dup_col
FROM `project.dataset1.table1` t1  
FULL OUTER JOIN `project.dataset2.table2` t2 USING (Name) 
FULL OUTER JOIN `project.dataset3.table3` t3 USING (Name) 
WHERE Name LIKE '%John%'     

正如您在此处看到的,我们添加了EXCEPT(dup_col)它从输出中消除了重复的列,但是我们显式添加了具有不同别名的那些列

所以,现在输出中没有重复的列,如下所示

Row Name    x   y   z   t1_dup_col  t2_dup_col   
1   John    a   b   c   qq          ww      

希望,您将能够将此应用于您的特定重复列
如果您有多个名称 - 只需将它们列在 EXCEPT 中

EXCEPT(dup_col1, dup_col2, dup_col3)   

推荐阅读