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

时间:2018-04-23 16:24:43

标签: sql google-bigquery

此问题是the question最初关于在Google大查询中使用表名作为前缀重命名列名的情况。 长话短说,我需要连接两个具有确切名称的表并保留列的来源。

我了解到我可以使用,例如:

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

此代码将生成一个包含列名的联接表,例如:google big query中的结果中的table_A.KEY1table_B.KEY1

但是我无法从联接表中取消选择某些列。例如,

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大查询是否可以有一些捷径可以做到。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

下面是BigQuery Standard SQL(我正在重新使用原始question and respective answer中的命名,以便保留上下文)

#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)