如何在 Redshift 中的 select 语句中使用存储过程
Posted
技术标签:
【中文标题】如何在 Redshift 中的 select 语句中使用存储过程【英文标题】:How to use a stored procedure inside of a select statement in Redshift 【发布时间】:2021-06-16 16:58:04 【问题描述】:我为 mysql 和其他数据库提供程序找到了一些其他解决方法,但我无法找到在 redshift 中的 select 语句中使用存储过程 (get_data) 的解决方案。我有一个存储过程传递一些 id 并从另一个表创建一个临时表 (tmp_tbl)。然后我想使用该表并通过一些操作从临时表中返回一些数据。
SELECT
tl.code,
tl.name,
SUM(tl.imps) as sales,
SUM(tl.clicks) as clicks
FROM (
CALL get_data('id1,id2');
SELECT * FROM tmp_tbl tl
)
WHERE filter='1990'
GROUP BY 1,2;
作为一种解决方案,我可以在其他地方单独执行存储过程,然后合并结果,但这意味着我必须从我的数据库发出两个单独的请求,我想避免它。或者我想出了其他解决方案,我仍然在不使用 select 语句中的存储过程的情况下进行一个数据库调用,但是我有一些其他代码依赖于这种结构,所以我想实现一个内部语句。有没有办法做到这一点?
程序;
CREATE OR REPLACE PROCEDURE get_data(f1 varchar(max))
AS $$
BEGIN
DROP TABLE IF EXISTS id_list;
CREATE TEMPORARY TABLE id_list (
Id varchar(40)
);
DROP TABLE IF EXISTS tmp_tbl;
FOR loop_var IN 1..(REGEXP_COUNT(f1,',') + 1) LOOP
INSERT INTO id_list VALUES (SPLIT_PART(f1,',',loop_var));
END LOOP;
CREATE TEMP TABLE tmp_tbl as
SELECT code, name,sales,clicks
FROM mview_a
WHERE id IN (SELECT id FROM id_list)
UNION ALL
SELECT code, name,sales,clicks
FROM mview_b
WHERE id IN (SELECT id FROM id_list)
UNION ALL
SELECT code, name,sales,clicks
FROM mview_c
WHERE id IN (SELECT id FROM id_list)
UNION ALL
SELECT code, name,sales,clicks
FROM view_d (combination of multiple mviews)
WHERE id IN (SELECT id FROM id_list)
UNION ALL
SELECT code, name,sales,clicks
FROM mview_e
WHERE id IN (SELECT id FROM id_list)
【问题讨论】:
get_data
的代码是什么样的?
我会编辑我的帖子并把它放在这里!
【参考方案1】:
难道你不能先运行CALL
来制作临时表,然后在后续的连接中使用它吗?
CALL get_data('id1,id2');
SELECT
tl.code,
tl.name,
SUM(tl.imps) as sales,
SUM(tl.clicks) as clicks
FROM tmp_tbl tl
WHERE filter='1990'
GROUP BY 1,2;
【讨论】:
嗯,我也想过,但我必须使用联合并使用外部选择语句聚合所有数据,如果我可以应用到我当前的结构,我会考虑这个。我还编辑了原始问题并添加了存储过程 嘿,伙计,我可以根据我的结构调整它并且它有效 - 非常感谢!赞成 @curiosityrock 很高兴听到这个消息。请更新您的帖子以显示您如何对其进行调整以使其正常工作,以便其他人在遇到此帖子时可以找到答案。以上是关于如何在 Redshift 中的 select 语句中使用存储过程的主要内容,如果未能解决你的问题,请参考以下文章