【问题标题】:Possible to do VLOOKUP as a udf in SQL可以在 SQL 中将 VLOOKUP 作为 udf 执行
【发布时间】:2021-11-28 07:26:05
【问题描述】:

让我们采取以下措施:

用于此的伪 sql 将是:

SELECT
   Name,
   Age,
   VLOOKUP(Name, OtherTable, Letter)
FROM
   Table

我认为将其编写为函数的低效方式类似于以下标量子选择:

VLOOKUP(TargetTable, TargetLookupField, TargetLookupValue, TargetReturnValue)
--> SELECT TargetReturnValue FROM TargetTable WHERE TargetLookupField=TargetLookupValue

进行查询重写以将标量子选择下推为联接是否有更好的方法?这是查询重写中的常用技术吗? BigQuery(或任何其他 RDBMS)是否足够聪明,能够检测到这一点并能够自行完成?

【问题讨论】:

  • 不确定这是否是您的要求,但 DBMS 具有查询优化器,它们会重写传递给它的 SQL,以便以它可以确定的最有效方式执行它
  • 我相信他确实知道。 @david542,我想我将不得不掸掉我的 Access 副本,看看解释对 DLOOKUP 的说明(如果访问甚至有解释)
  • 例如,您可以使用right join 定义vlookup。但我认为您不能在参数中发送表名。您在询问优化,比较标量子选择和连接,执行时间会有所不同,我想在这种情况下查询不会自动优化。这是你要求的吗?
  • @ewertonvsilva 它将是一个left join,从数据表到查找。否则就没有意义了。

标签: sql google-bigquery


【解决方案1】:

因此,从一开始就执行它的最佳方法是使用join,但是,UDF 将起作用。

我已经为您比较了两种方式作为示例:

1-用User Defined Function 实现VLOOKUP(不推荐):

CREATE TEMP FUNCTION VLOOKUP_SCALAR(user string)
AS (( SELECT letter FROM `data_letter` WHERE name=user));

SELECT name, VLOOKUP_SCALAR(name) as vlookup  FROM `data`;

1-结果(更多步骤、时间和字节被打乱):

2-用JOIN 实现VLOOKUP(推荐):

SELECT t1.name, letter 
 from `data` AS t1 
LEFT JOIN `data_letter` AS t2 
 ON t1.name = t2.name;

2-结果(更少的步骤、时间和字节数):

【讨论】:

  • @ewertonsilva -- 谢谢。为什么 BigQuery 不能自己执行这种优化,或者 BQ 中真的没有查询优化器?
  • -- 也可以是left join。 vlookup 从数据表到查找表,反之亦然。
  • BQ 确实有它,就像其他数据库系统一样,但是在这种情况下,您明确要求数据库对返回的每个数据行执行 UDF,这不是可以识别和优化的情况。查询优化也是幕后的编程逻辑,所以没有魔法,优化的情况必须是可预测的。
  • 我已经编辑了答案以更正查询。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2019-04-14
  • 2017-01-16
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 2015-09-11
相关资源
最近更新 更多