[英]Snowflake (stored procedure): split one table into several tables programmatically using stored procedures
我在雪花数据库中有一张大表,我想根据一列将其拆分为较小的表。
大表展示了三类动物(狮子、老虎、斑马)。 我想以编程方式(非硬编码)将其拆分为单独的狮子、老虎和斑马表。
我怎样才能做到这一点? 理想情况下,我想用雪花中的存储过程来做到这一点。
这是期望结果的示例。 实际上,我有 1000 多种动物,这就是为什么需要根据“动物”列中的值自动化表创建过程的原因。
原表
动物 | 姓名 |
---|---|
狮子 | 乔治 |
老虎 | 约翰 |
狮子 | 帕特里克 |
老虎 | 山姆 |
狮子 | 保罗 |
斑马 | 莎拉 |
新桌:狮子桌
姓名 |
---|
乔治 |
帕特里克 |
保罗 |
新桌:老虎桌
姓名 |
---|
约翰 |
山姆 |
新桌:斑马桌
姓名 |
---|
莎拉 |
这是源表:
CREATE TABLE mytable(
Animal VARCHAR(5) NOT NULL PRIMARY KEY
,Name VARCHAR(7) NOT NULL
);
INSERT INTO mytable(Animal,Name) VALUES ('Lion','Georg');
INSERT INTO mytable(Animal,Name) VALUES ('Tiger','John');
INSERT INTO mytable(Animal,Name) VALUES ('Lion','Patrick');
INSERT INTO mytable(Animal,Name) VALUES ('Tiger','Sam');
INSERT INTO mytable(Animal,Name) VALUES ('Lion','Paul');
INSERT INTO mytable(Animal,Name) VALUES ('Zebra','Sarah');
您可以使用 Snowflake 脚本生成这些表:
CREATE PROCEDURE generate_tables()
RETURNS VARCHAR
LANGUAGE SQL
AS
DECLARE
srctable VARCHAR := 'mytable';
c1 CURSOR FOR SELECT DISTINCT Animal FROM mytable;
BEGIN
FOR c IN c1 DO
EXECUTE IMMEDIATE 'CREATE TABLE ' || c.Animal || ' AS SELECT Name FROM ' || srctable || ' WHERE Animal = ''' || c.Animal || '''';
END FOR;
RETURN 'OK';
END;
call generate_tables();
它生成表格:
Select * from lion;
Select * from Tiger;
Select * from Zebra;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.