将旧版 SQL 查询转换为标准 SQL

Posted

技术标签:

【中文标题】将旧版 SQL 查询转换为标准 SQL【英文标题】:Converting Legacy SQL Query to Standard SQL 【发布时间】:2019-04-23 21:37:23 【问题描述】:

我希望将以下旧版 SQL 查询转换为标准 SQL。我遇到的问题是我需要取消嵌套两个表(标签和学分)。如何转换此查询?谢谢!

每当我尝试重写此查询时,都会遇到“标量子查询产生了多个元素”(见下文)。

我正在尝试重写的旧版 SQL 查询:

SELECT
  service.description,
  sku.description,
  usage_start_time,
  usage_end_time,
  labels.key,
  labels.value,
  cost,
  usage.amount,
  project.name,
  credits.name,
  credits.amount
FROM
  flatten([gcp_billing_data.gcp_billing_export],
    credits)

到目前为止我在标准 SQL 中的尝试:

SELECT
  service.description AS service,
  sku.description AS sku,
  usage_start_time,
  usage_end_time,
  l.key,
  l.value,
  cost,
  usage.amount AS usage,
  project.name AS project,
  c.name AS credit,
  c.amount
FROM
  `gcp_billing_data.gcp_billing_export`,
  UNNEST(labels) AS l,
  UNNEST(credits) AS c
Group by 1,2,3,4,5,7,8,9,10,11

此查询运行,但行数明显少于我的预期。

【问题讨论】:

对我个人而言 - 您正在使用的原始查询 - 看起来根本不符合要求 - 因为它在标签上重复了多次成本和信用 - 所以总结果最终将比实际结果大 x 倍.因此,如果您可以提供输入数据和预期输出的简化示例 - 并解释您究竟想要得到什么 - 这将加快答案:o) ...虽然快速而正式的修复类似于将(select l.value from unnest(labels) as l) 替换为(select string_agg(l.value) from unnest(labels) as l) 那么学分呢?是否应该与标签交叉连接? @MikhailBerlyant 我不太确定。您可以在旧版 SQL 中看到我需要做的就是选择标签。所以我不确定通过扁平化和“,”连接的性质。我假设这是一个交叉连接?感谢您在之前的评论中提供的帮助。该查询现在运行。 好的。所以,顺便说一句,这就是为什么我要求您发布输入和输出的简化示例,以便我们可以帮助您了解它应该如何工作/如何工作。同时-如果它对您有用-我会将其发布为答案:o) 【参考方案1】:

在标准 SQL 中对您的查询进行快速和正式的修复类似于在下面替换

(select l.value from unnest(labels) as l)    

(select string_agg(l.value) from unnest(labels) as l)   

但它仍然与您的 Legacy SQL 查询版本的初始版本不完全相同

【讨论】:

感谢您发布此内容,虽然这解决了我在尝试的解决方案中看到的错误,但我同意您之前的评论,即这不反映原始查询。 我已根据您的 cmets 更新了原始问题中的查询,但结果中的行数明显少于我的预期。您的想法将不胜感激。

以上是关于将旧版 SQL 查询转换为标准 SQL的主要内容,如果未能解决你的问题,请参考以下文章