繁体   English   中英

如何在 Vertica SQL 中创建表值函数?

[英]How to create table-valued functions in Vertica SQL?

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

比如我想创建一个 function

f_student_name()

接受输入: student_id

返回 output: student_name

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

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

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

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

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

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

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

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

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
)

, 并且两个VARCHAR由魔术填充 - 它实际上非常高效。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM