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);';