Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google BigQuery SQL:阻止在加入后重命名列前缀_Sql_Join_Google Bigquery_Prefix - Fatal编程技术网

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

Google BigQuery SQL:阻止在加入后重命名列前缀,sql,join,google-bigquery,prefix,Sql,Join,Google Bigquery,Prefix,假设您有一个表“包含100列的表” 你想用一个简单的连接再添加一列。。。不更改所有列名。换句话说,你希望写一些像 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 仅仅为了向表中添加一列而编写100行不必要的代码效率低得令人难以置信——所以我希望有更好的

假设您有一个表“包含100列的表”

你想用一个简单的连接再添加一列。。。不更改所有列名。换句话说,你希望写一些像

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
仅仅为了向表中添加一列而编写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行不必要的代码作为代码的一部分。
因此,您需要了解如何真正以最理想的方式为您的特定用例制作

我想可能有很多,但我看到了下面最明显的两个——它们更不那么琐碎,但为了我答案的完整性,我把它们放在这里:

选项1–一次性行动/需求

只需将下面语句的输出放入任何电子表格中,将其转换为预期的SQL(至少是问题的第二个查询中SELECT和FROM之间的部分)

换言之,您可以使用任何最友好的办公工具手动执行此操作

选项2–您需要在更不频繁的基础上或作为某些流程的一部分进行此操作

通过使用检索架构并查找,使用您选择的任何一种方式生成SQL代码

组装sql代码后-使用
可以是
get
insert
或任何适合您的实现逻辑的内容

选项3–BigQuery Mate“添加字段”按钮

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


已部署选项3,支持别名使用。现在可在web store中使用

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

自Cloud SDK发布(2016-09-21)起,新的标准SQL查询参数包括一个作为Cloud BigQuery一部分的功能。事实上,调用
完全外部联接
(或者简单地说是
完全联接
)会从满足联接条件的\u项
返回两个
中所有行的所有字段


因此,在标准SQL中运行查询将使您能够向预先存在的表中添加另一列(不重命名任何列),只要将
完全联接指定为查询的一部分即可。有关如何使标准SQL与BigQuery语句一起使用的更多信息,请参阅此启用标准SQL。

我认为此问题特定于BigQuery遗留SQL。
如果您将使用大型标准SQL—您将不会遇到此问题—请参见下面的示例

#标准SQL
将带有\u 100\u列的表\u作为(
选择11作为col1,21作为col2,31作为col3 UNION ALL
选择12作为col1,选择22作为col2,选择32作为col3 UNION ALL
选择13作为col1,选择23作为col2,选择33作为col3 UNION ALL
选择14作为col1,选择24作为col2,选择34作为col3 UNION ALL
选择15作为列1,选择25作为列2,选择35作为列3
),
表_中的_2_列为(
选择11作为键,选择17作为附加字段UNION ALL
选择12作为键,选择27作为附加字段UNION ALL
选择13作为键,选择37作为附加字段UNION ALL
选择14作为键,选择47作为附加字段UNION ALL
选择15作为键,选择57作为附加字段
)
选择一个*的附加字段
从'table_with_100_columns'作为
将'table_与'u 2_列'连接为b
在a.col1=b.key上
如果需要将查询的其余部分重写为标准SQL,请参见案例

输出如下,带有原始列名(不带前缀)

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

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

我通过替换SQL语句的选择部分成功地解决了这个问题

SELECT *
FROM table1 t1
LEFT JOIN table2 t2
ON [some_condition]
GROUP BY [group_columns]


现在,column1将显示为new\u name1而不是t1\u column1

您是否尝试过用python或类似的东西生成SQL代码?当然,但这样做通常需要首先使用辅助查询来获取所有列名,提取列,然后每次生成SQL。由客户机用户处理这件事很奇怪。这也使得代码非常冗长,30k字符的截止值不允许在查询描述中使用超过3或4个连接。这是一个非常简单的功能,特别是如果表的列中有列,我想有一种方法可以使用Google BigQuery来实现。嗨,米哈伊尔,我很感谢你的回答!但是,您的回答并没有为所发布的问题提供合理的解决方案(请参阅我上面关于使用客户机程序生成sql的缺点的评论,即它通常不可能,需要大量工作,并且仍然会生成非常长的sql查询,在描述中会被截断)。看来根本没有解决办法。明白了。当我提供答案时,我没有看到你的评论检查选项3。这在BQMate中还没有,但假设是这样的话——BQUI中的这种功能对您的情况有帮助吗?很好的模型。但是,我觉得这应该在不添加UI的情况下处理。我提出了一个不同的解决方案。相反,只需检查->若SELECT子句中并没有同名字段,则无需给出subtable
SELECT * FROM table_with_100_columnsoutput WHERE false
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]