PostgreSQL在循环中将别名与别名联系起来

时间:2018-04-06 10:54:39

标签: postgresql plpgsql

是否可以迭代表的记录并在存储过程中与它们进行左连接? 像这样:

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,它也是正确的。

1 个答案:

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