如何处理多个WITH子句SQL中的重复列

时间:2019-07-19 00:12:48

标签: sql google-bigquery

我正在尝试使用WITH中的多个bigquery子句创建查询。我收到错误消息:Duplicate column names in the result are not supported. Found duplicate(s):,因为表中有一些重复的列。

问题是我无法删除它们,因为我需要将其显示在表中,并且表的group by子句中也需要它们。

我的代码有点像这样:

WITH table0 as (## query0),
table1 AS (## query1),
table2 as (## query2),
table3 as (## query3),
table4 as (## query4),
table5 as (## query 5)
select
  *
from
  table0,
  table1,
  table2,
  table3,
  table4,
  table5

如何处理WITH中多个SQL子句中的重复列

2 个答案:

答案 0 :(得分:0)

为什么要创建子查询的笛卡尔积?

无论如何,与其他数据库相比,BigQuery为您提供了对列的更多控制。因此,如果col1table0共用table1,则可以执行以下操作:

select t1.*, t2.* except (col1)

如果要同时保留两个值:

select t1.*, t2.* except (col1), t2.col1 as t2_col1

select t1.* except (col1),
       t2.* except (col1),
       t1.col1 as t1_col1,
       t2.col1 as t2_col1

答案 1 :(得分:0)

从您先前的问题(看起来已删除)开始,我想我记得您的用例,并且您有(可能是错误的)仅用于JOIN的字段是“重复的”
在这种情况下,您可以使用以下方法(在下面的示例中,假定那些重复的字段为idday

#standardSQL
SELECT *
FROM `project.dataset.table0` 
JOIN `project.dataset.table1` USING(id, day)
JOIN `project.dataset.table2` USING(id, day)
JOIN `project.dataset.table3` USING(id, day)  

例如在以下超级简化的虚拟示例中

#standardSQL
WITH `project.dataset.table0` AS (
  SELECT 1 id, '2019-01-01' day, 0 col0
), `project.dataset.table1` AS (
  SELECT 1 id, '2019-01-01' day, 1 col1
), `project.dataset.table2` AS (
  SELECT 1 id, '2019-01-01' day, 2 col2
), `project.dataset.table3` AS (
  SELECT 1 id, '2019-01-01' day, 3 col3
)
SELECT *
FROM `project.dataset.table0` 
JOIN `project.dataset.table1` USING(id, day)
JOIN `project.dataset.table2` USING(id, day)
JOIN `project.dataset.table3` USING(id, day)  

结果将是

Row id  day         col0    col1    col2    col3     
1   1   2019-01-01  0       1       2       3      

不抱怨重复字段

从上面的示例中可以看到-使用USING()而不是ON“ magicaly”解决了该问题-但再次注意-仅在“重复”字段都是JOIN字段的情况下