在循环包含2个子查询结果的记录时访问列

问题描述:

我有一个代码块,其中循环包含两个连接的子查询的记录,这些子查询在不同的表中包含同名命名的列。在循环包含2个子查询结果的记录时访问列

现在,我似乎能够访问SQ1和SQ2的记录,但没有内容,我总是得到“中记录的数据类型无法识别列‘C1’”,即使我添加显式别名的列:

DO $$ 
DECLARE 
    r record; 
BEGIN 
    FOR r IN SELECT sq1, sq2 
     FROM (SELECT t1.someColumn as c1, t2.someColumn as c2, ... FROM Table1 t1 JOIN Table2 t2 ...) sq1 
     JOIN (SELECT t1.someColumn as c1, t2.someColumn as c2, ... FROM Table1 t1 JOIN Table2 t2 ...) sq2 
     ON (sq1.joinColumn1 = sq2.joinColumn2 AND sq1.joinColumn2 = sq2.joinColumn1) 
    LOOP 
     INSERT INTO Table3 (column1, column2) 
     VALUES ((r.sq1).c1, (r.sq2).c1); 
       --^ error occurs here 
    END LOOP; 
END$$; 

我正在寻找一种方式来访问类似于以下方式记录:

r.sq1.t1.someColumn 

为访问您的变量中的3级,您必须将它转换为命名的记录类型。这可能是表或类型:

适用类型:

CREATE TYPE my_type AS (c1 int4, c2 int4, joinColumn1 int4); 

对于表:

CREATE TABLE my_type (c1 int4, c2 int4, joinColumn1 int4); 

之后,你可以做这样的事情:

DO $$ 

DECLARE 
    r record; 
BEGIN 
    FOR r IN SELECT (sq1.*)::my_type AS sq1, (sq2.*)::my_type AS sq2 
     FROM (SELECT 10 as c1, 11 as c2, 1 as joinColumn1) sq1 
     JOIN (SELECT 20 as c1, 21 as c2, 1 as joinColumn2) sq2 
     ON (sq1.joinColumn1 = sq2.joinColumn2) 
    LOOP 
      RAISE NOTICE '%', r; 
      RAISE NOTICE '%', r.sq1; 
      RAISE NOTICE '% %', (r.sq1).c1, (r.sq2).c1; 
      INSERT INTO Table3 (column1, column2) 
      VALUES ((r.sq1).c1, (r.sq2).c1); 
    END LOOP; 
END$$; 
+0

非常好,正是我期待的,谢谢!这样我甚至可以摆脱c1和c2的别名。 – realheri