Google BigQuery SQL:防止列前缀在加入后重命名

Google BigQuery SQL: Prevent column prefix renaming after join

假设你有一个 table "table_with_100_columns."

并且您想通过简单的连接再添加一列...而不更改所有列名。换句话说,你希望写成

SELECT a.* as <a's columns without prefix>, additional_field
FROM [table_with_100_columns] a
JOIN [table_with_2_columns] b
ON a.col1 = b.key

您应该能够执行此操作以生成包含 101 列的新 table,而无需手动重命名每一列。现在我知道如何做到这一点的唯一方法如下:

SELECT
  a.col1 as col1,
  a.col2 as col2,
  a.col3 as col3,
  ...
  a.col100 as col100,
  b.additional_field as additional_field
FROM [table_with_100_columns] a
JOIN [table_with_2_columns] b
ON a.col1 = b.key

仅仅为了向 table 添加一列而不得不编写 100 行不必要的代码是令人难以置信的低效 - 所以我希望有更好的方法在加入时保留列名?

更新

这在 BigQuery 中似乎还不可能。它非常容易实施,我向 Google BigQuery 团队提出以下建议:

if no fields share a name in SELECT clause:
  if no subtable reference names given:
    Do not rename fields after JOIN

这不会破坏任何当前功能,并且会添加对非常有用的功能的简单支持。

我不知道这里现在有什么选项可用,而不是让那些 100 unnecessary lines 成为代码的一部分。
因此,对于您的特定用例,您需要 how to actually make it in most optimal way
我认为可能有很多,但我在下面看到最明显的两个——它们更不重要,但为了我的回答的完整性,我把它放在这里:

Option 1 –one off action/need

只需将以下语句的输出放入任何电子表格中,将其转置并打扮成预期的 SQL(至少在您问题的第二个查询中 SELECT 和 FROM 之间的部分)

SELECT * FROM table_with_100_columnsoutput WHERE false

换句话说,您可以使用手中最友好的办公工具手动完成此操作

Option 2 – you need this on more-less frequent basis or as a part of some process

使用任何 language/client of your choice by retrieving schema with Tables:get API and looking for schema.fields[]

生成 SQL 代码

汇编 sql 代码后 - 您可以使用 API of your choice
执行它 可以是 getinsert 或任何适合您的实现逻辑的东西

Option 3 – BigQuery Mate “Add Fields” Button

第 1 步 – select table 在导航栏中,以便您可以在内容面板中看到 table 的架构
第 2 步 – 在查询编辑器中将光标设置在需要插入字段的位置
第 3 步 – 单击“添加字段”按钮

已部署支持别名使用的选项 3。现已在网上商店发售

目前最简单的解决方案是使用标准 SQL,它不会为任何连接表所特有的任何字段添加前缀。

截至发布 127.0.0(2016-09-21) of the Cloud SDK, new Standard SQL query parameters include a FULL [OUTER] JOIN 功能作为 Cloud BigQuery 的一部分。事实上,调用 FULL OUTER JOIN(或简称 FULL JOIN)returns 满足连接条件的 from_items 中所有行的所有字段。

因此,运行 您在标准 SQL 中的查询将使您能够向预先存在的 table 添加另一列(无需重命名),只要您指定 FULL JOIN 作为查询的一部分。有关如何启用标准 SQL 以与您的 BigQuery 语句一起使用的更多信息,请参阅此启用标准 SQL reference.

我认为这个问题是 BigQuery Legacy 特有的 SQL。
如果您将使用大标准 SQL - 您将不会遇到此问题 - 请参阅下面的示例

#standardSQL
WITH table_with_100_columns AS (
  SELECT 11 AS col1, 21 AS col2, 31 AS col3 UNION ALL 
  SELECT 12 AS col1, 22 AS col2, 32 AS col3 UNION ALL
  SELECT 13 AS col1, 23 AS col2, 33 AS col3 UNION ALL
  SELECT 14 AS col1, 24 AS col2, 34 AS col3 UNION ALL
  SELECT 15 AS col1, 25 AS col2, 35 AS col3   
),
table_with_2_columns AS (
  SELECT 11 AS key, 17 AS additional_field UNION ALL
  SELECT 12 AS key, 27 AS additional_field UNION ALL
  SELECT 13 AS key, 37 AS additional_field UNION ALL
  SELECT 14 AS key, 47 AS additional_field UNION ALL
  SELECT 15 AS key, 57 AS additional_field   
)
SELECT a.*, additional_field
FROM `table_with_100_columns` AS a
JOIN `table_with_2_columns` AS b
ON a.col1 = b.key  

如果您需要将其余查询重写为标准 SQL

,请参阅 Migrating from legacy SQL

输出将如下所示,带有原始列名(w/o 前缀)

col1    col2    col3    additional_field     
13      23      33      37   
11      21      31      17   
15      25      35      57   
12      22      32      27   
14      24      34      47   

因为我需要坚持使用 Legacy SQL(因为我正在与另一个使用 Legacy SQL 的系统集成并且由于列前缀而崩溃)

我通过替换 SQL

的选择部分设法解决了这个问题
SELECT *
FROM table1 t1
LEFT JOIN table2 t2
ON [some_condition]
GROUP BY [group_columns]

SELECT 
column1 as new_name1,
column2 as new_name2,
column3 as new_name3
FROM table1 t1
LEFT JOIN table2 t2
ON [some_condition]
GROUP BY [group_columns]

现在 column1 将显示为 new_name1 而不是 t1_column1