是否可以迭代表的记录并在存储过程中与它们进行左连接? 像这样:
FOR r IN SELECT tablename FROM tablewithtablenames ORDER BY tablename ASC
LOOP
INSERT INTO temp_Results
SELECT
temp_ids.Key as Key,
loggedvalue.pk_timestamp,
FROM
(temp_idS AS temp_ids
LEFT JOIN
quote_ident(r.tablename) AS loggedvalue
ON temp_ids.Key = loggedvalue.pk_fk_id);
END LOOP;
不幸的是,当我想执行存储过程时,我收到以下错误消息。 (功能创建成功。)
错误讯息:
错误:列loggedvalue.pk_fk_id不存在第29行:
ON temp_ids.Key =" logsvalue ...
我觉得我以错误的方式转换记录可能是因为当我手动将quote_ident(r.tablename)替换为我知道 r 包含它的表的名称时很好,我也跟踪了循环中的r.tablename,它也是正确的。
答案 0 :(得分:0)
由于a_horse_with_no_name指出我应该使用动态sql,因为在plpgsql中你不能使用变量作为表名,所以我消除了循环,我使用了 union all :
CREATE OR REPLACE FUNCTION getaffectedtables(
OUT tableNames TEXT)
as $$
BEGIN
SELECT TRIM(TRAILING ' UNION ALL ' FROM string_agg('','SELECT * FROM "' || "tablename" || '" UNION ALL '))
INTO tableNames
FROM exampleTable;
END;$$
LANGUAGE plpgsql;
然后我使用了动态执行:
DECLARE
affectednames TEXT;
BEGIN
affectednames := getaffectedtables();
EXECUTE '
SELECT
temp_ids.Key as Key,
loggedvalue.pk_timestamp,
FROM
(temp_idS AS temp_ids
LEFT JOIN
('|| affectednames ||') AS loggedvalue
ON temp_ids.Key = loggedvalue.pk_fk_id);';