无法在 Google BigQuery 中将此旧版 SQL 转换为标准 SQL
Posted
技术标签:
【中文标题】无法在 Google BigQuery 中将此旧版 SQL 转换为标准 SQL【英文标题】:Unable to convert this legacy SQL into Standard SQL in Google BigQuery 【发布时间】:2019-03-25 06:08:23 【问题描述】:我无法将此旧版 sql 验证为标准 bigquery sql,因为我不知道此处还需要更改什么(如果我选择标准 SQL 作为大查询方言,此查询将在验证期间失败):
SELECT
lineitem.*,
proposal_lineitem.*,
porder.*,
company.*,
product.*,
proposal.*,
trafficker.name,
salesperson.name,
rate_card.*
FROM (
SELECT
*
FROM
dfp_data.dfp_order_lineitem
WHERE
DATE(end_datetime) >= DATE(DATE_ADD(CURRENT_TIMESTAMP(), -1, 'YEAR'))
OR end_datetime IS NULL ) lineitem
JOIN (
SELECT
*
FROM
dfp_data.dfp_order) porder
ON
lineitem.order_id = porder.id
LEFT JOIN (
SELECT
*
FROM
adpoint_data.dfp_proposal_lineitem) proposal_lineitem
ON
lineitem.id = proposal_lineitem.dfp_lineitem_id
JOIN (
SELECT
*
FROM
dfp_data.dfp_company) company
ON
porder.advertiser_id = company.id
LEFT JOIN (
SELECT
*
FROM
adpoint_data.dfp_product) product
ON
proposal_lineitem.product_id=product.id
LEFT JOIN (
SELECT
*
FROM
adpoint_data.dfp_proposal) proposal
ON
proposal_lineitem.proposal_id=proposal.id
LEFT JOIN (
SELECT
*
FROM
adpoint_data.dfp_rate_card) rate_card
ON
proposal_lineitem.ratecard_id=rate_card.id
LEFT JOIN (
SELECT
id,
name
FROM
dfp_data.dfp_user) trafficker
ON
porder.trafficker_id =trafficker.id
LEFT JOIN (
SELECT
id,
name
FROM
dfp_data.dfp_user) salesperson
ON
porder. salesperson_id =salesperson.id
【问题讨论】:
首先,将您的代码片段重新排列成一个易于阅读的片段。其次,标准sql是什么意思?好像没问题。 @Edward Aung 当我们将上面的查询粘贴到大查询编辑器中并将查询设置作为旧版时,它工作正常。但是,如果您的大查询编辑器使用的是标准 SQL(大查询 sql 方言类型),则在验证期间会失败。 错误是什么?我们看不到您的屏幕... @MikhailBerlyant 为迟到的回复道歉,我已将您的答案标记为已接受。再次非常感谢:) 【参考方案1】:您遇到的错误很可能类似于以下内容
Duplicate column names in the result are not supported. Found duplicate(s): name
旧版 SQL 将 SELECT 语句中的 trafficker.name
和 salesperson.name
分别调整为 trafficker_name
和 salesperson_name
从而有效地消除列名重复
标准 SQL 的行为不同,并将这两个列都视为名为 name
的列,因此会产生重复情况。为避免这种情况 - 您只需提供别名,如下例所示
SELECT
lineitem.*,
proposal_lineitem.*,
porder.*,
company.*,
product.*,
proposal.*,
trafficker.name AS trafficker_name,
salesperson.name AS salesperson_name,
rate_card.*
FROM ( ...
您可以使用以下简化/虚拟查询轻松检查上述说明
#legacySQL
SELECT
porder.*,
trafficker.name,
salesperson.name
FROM (
SELECT 1 order_id, 'abc' order_name, 1 trafficker_id, 2 salesperson_id
) porder
LEFT JOIN (SELECT 1 id, 'trafficker' name) trafficker
ON porder.trafficker_id =trafficker.id
LEFT JOIN (SELECT 2 id, 'salesperson' name ) salesperson
ON porder. salesperson_id =salesperson.id
和
#standardSQL
SELECT
porder.*,
trafficker.name AS trafficker_name,
salesperson.name AS salesperson_name
FROM (
SELECT 1 order_id, 'abc' order_name, 1 trafficker_id, 2 salesperson_id
) porder
LEFT JOIN (SELECT 1 id, 'trafficker' name) trafficker
ON porder.trafficker_id =trafficker.id
LEFT JOIN (SELECT 2 id, 'salesperson' name ) salesperson
ON porder. salesperson_id =salesperson.id
注意:如果您有更多重复的名称 - 您也需要为所有名称设置别名
【讨论】:
准确解释了对我有用的方法,非常感谢。以上是关于无法在 Google BigQuery 中将此旧版 SQL 转换为标准 SQL的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery 中用于 Google Analytics 数据的标准 SQL 还是旧版 SQL?
如何使用 AppScript 在 BigQuery 中将 Google 工作表持久化为表格
无法将 BigQuery 旧版 SQL 转换为 HAVING LEFT(...) 的标准 SQL