[英]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
由魔术填充 - 它实际上非常高效。
就我而言,一种更清洁的方法....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.