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
执行它
可以是 get
或 insert
或任何适合您的实现逻辑的东西
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
假设你有一个 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
执行它
可以是 get
或 insert
或任何适合您的实现逻辑的东西
Option 3 – BigQuery Mate “Add Fields” Button
第 1 步 – select table 在导航栏中,以便您可以在内容面板中看到 table 的架构
第 2 步 – 在查询编辑器中将光标设置在需要插入字段的位置
已部署支持别名使用的选项 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