PostgreSQL 在循环中左连接别名
PostgreSQL left join with alias in a loop
是否可以迭代 table 的记录并在存储过程中与它们进行左连接?
像这样:
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;
不幸的是,当我想执行存储过程时,我收到以下错误消息。 (函数创建成功。)
错误信息:
ERROR: column loggedvalue.pk_fk_id does not exist LINE 29:
ON temp_ids.Key = "loggedvalue...
我感觉我以错误的方式转换了记录,这可能是因为当我手动将 quote_ident(r.tablename) 替换为我知道的 table 的名称时r 包含它很好,我还追踪了循环中的 r.tablename,它也是正确的。
正如 a_horse_with_no_name 指出的那样,我应该使用动态 sql 因为在 plpgsql 中你不能使用变量作为 table 名称所以我消除了循环我使用了 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);';
是否可以迭代 table 的记录并在存储过程中与它们进行左连接? 像这样:
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;
不幸的是,当我想执行存储过程时,我收到以下错误消息。 (函数创建成功。)
错误信息:
ERROR: column loggedvalue.pk_fk_id does not exist LINE 29:
ON temp_ids.Key = "loggedvalue...
我感觉我以错误的方式转换了记录,这可能是因为当我手动将 quote_ident(r.tablename) 替换为我知道的 table 的名称时r 包含它很好,我还追踪了循环中的 r.tablename,它也是正确的。
正如 a_horse_with_no_name 指出的那样,我应该使用动态 sql 因为在 plpgsql 中你不能使用变量作为 table 名称所以我消除了循环我使用了 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);';