2017-03-02 51 views
0

我有一個代碼塊,其中循環包含兩個連接的子查詢的記錄,這些子查詢在不同的表中包含同名命名的列。在循環包含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 

回答

1

爲訪問您的變量中的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