Sql 使用默认表名作为前缀连接表后,在SELECT EXCEPT()中索引列

Sql 使用默认表名作为前缀连接表后,在SELECT EXCEPT()中索引列,sql,google-bigquery,Sql,Google Bigquery,这个问题是关于在google big query中使用表名作为前缀重命名列名的问题。 长话短说,我需要用确切的名称连接两个表,并保留列的起源 我学会了我可以使用,例如: SELECT table_A , table_B FROM table_A FULL JOIN table_B USING (KEY1, KEY2, KEY3) 这段代码将生成一个具有列名的联接表,例如:table_a.KEY1,table_B.KEY1,在google big query的结果中 但是,我很难从联接表中取消选

这个问题是关于在google big query中使用表名作为前缀重命名列名的问题。 长话短说,我需要用确切的名称连接两个表,并保留列的起源

我学会了我可以使用,例如:

SELECT table_A , table_B
FROM table_A
FULL JOIN table_B
USING (KEY1, KEY2, KEY3)
这段代码将生成一个具有列名的联接表,例如:
table_a.KEY1
table_B.KEY1
,在google big query的结果中

但是,我很难从联接表中取消选择某些列。比如说,

WITH merged AS (
    SELECT table_A , table_B
    FROM table_A
    FULL JOIN table_B
    USING (KEY1, KEY2, KEY3)
)

SELECT * EXCEPT(table_A.KEY1, table_B.KEY1)
FROM merged
我犯了这个错误

语法错误:应为“)”或“,”但得到“

有人知道如何回避这个问题吗?提前谢谢你

此操作的目的是将长桌子重塑为宽桌子。 例如,我有一张长桌子

KEY1 KEY2 KEY3 VALUE1 VALUE2 DOC_TYPE
1     2     3   A      Q     PAY
1     2     3   A      Q     INVOICE
2     3     4   D      B     PAY
2     3     4   D      B     INVOICE
理想情况下,使用KEY1 KEY2 KEY3重塑宽表:

KEY1 KEY2 KEY3 VALUE1.pay VALUE2.pay VALUE1.inv VALUE2.inv 
1     2     3   A         Q          A          Q   
2     3     4   D         B          D          B  

因为该表包含许多列。手动重命名它们是不切实际的。我想知道Google big query是否有一些快捷方式可以做到这一点。

下面是BigQuery标准SQL(我正在重新使用您的原始名称以保留上下文)

WITH merged AS (
    SELECT table_A , table_B
    FROM table_A
    FULL JOIN table_B
    USING (KEY1, KEY2, KEY3)
)

SELECT
  (SELECT AS STRUCT table_A.* EXCEPT(KEY1)) AS table_A,
  (SELECT AS STRUCT table_B.* EXCEPT(KEY1)) AS table_B
FROM merged

下面是BigQuery标准SQL(我正在重新使用原始SQL的命名,以便保留上下文)


实际原因是什么?询问不仅仅是出于好奇,而是为了为你找到合适的解决方案。。。在你最初的问题中,你提到在那些表中有100多列——那么仅仅删除一列的实际用例是什么呢?谢谢!因此,我们的想法是将长表更改为宽表,然后在宽表上应用过滤算法。我会在问题中写更多的细节。我的理解是,3个键只是一个例子,实际上你有100个?正确的?所以你不想手动操作,就像你只需要三个键一样?对吗?有4个键,但值列是100+。其思想是使用4个键将值列移到一侧,以确保行不匹配。表中只有两种类型的文档。所以我想,如果我只是分成两个表并合并它们,那么在BQSQL中就更容易了?询问不仅仅是出于好奇,而是为了为你找到合适的解决方案。。。在你最初的问题中,你提到在那些表中有100多列——那么仅仅删除一列的实际用例是什么呢?谢谢!因此,我们的想法是将长表更改为宽表,然后在宽表上应用过滤算法。我会在问题中写更多的细节。我的理解是,3个键只是一个例子,实际上你有100个?正确的?所以你不想手动操作,就像你只需要三个键一样?对吗?有4个键,但值列是100+。其思想是使用4个键将值列移到一侧,以确保行不匹配。表中只有两种类型的文档。所以我想,如果我只是分成两个表并合并它们,在BQSQL中会更容易。
#standardSQL
SELECT 
  key1, key2, key3, key4, 
  (SELECT AS STRUCT inv.* EXCEPT(key1, key2, key3, key4)) inv, 
  (SELECT AS STRUCT prof.* EXCEPT(key1, key2, key3, key4)) prof
FROM inv FULL JOIN prof
USING (key1, key2, key3, key4)