0

有谁知道如何在 Vertica SQL 中创建表值函数?

比如我想创建一个函数

f_student_name()

接受输入:student_id

返回输出:student_name

在查询中,直接从students表中提取,其中student_id, student_name唯一的 1:1 映射。

用例:不必为大量查询不断地加入同一张表,提高可读性并减少意大利面条式代码。

我似乎找不到任何关于此的文档。Vertica 中的函数文档仅提供了通过硬编码创建函数的示例(CASE x when ... then ...)

我想使用 VSQL 构建这个表值函数,但使用 Python 的最佳解决方案(并让该函数在 Vertica 中工作)也可以。

4

1 回答 1

0

表值函数往往会在查询计划中创建大量嵌套循环。Vertica 作为大数据 DBMS 具有通用架构,该架构倾向于避免任何会减慢查询计划的事情。

连接不是意大利面条代码。它们是关系范式的一部分。

想想看,我所知道的意大利面条代码是指过程或面向对象语言的流程。您可以使用从 COBOL 到 Pascal 到 C 甚至 Python 的任何东西创建意大利面条式代码,但不能使用 SQL 构成的描述性语言......

但是为了简化代码并使您的查询更快,请尝试使用扁平列

CREATE TABLE f_marks (
  mark_ts TIMESTAMP
, subject_id INT
, stud_id INT
, subject VARCHAR(32) 
  DEFAULT (SELECT subject FROM d_subject WHERE id=f_marks.subject_id)
, stud_name VARCHAR(32) 
  DEFAULT (SELECT stud_name FROM d_student WHERE id=f_marks.stud_id)
);

您插入f_marks使用:

INSERT INTO f_marks (
  mark_ts,subject_id,stud_id
) VALUES (
  CURRENT_TIMESTAMP,4321,123986
)

, 并且这两个VARCHARs 是由魔法填充的 - 它实际上非常高效。

就我而言,一种更清洁的方法....

这是关于它的文档: https ://www.vertica.com/docs/10.0.x/HTML/Content/Authoring/AnalyzingData/FlattenedTables/FlattenedTables.htm

于 2020-05-17T23:50:32.513 回答