>
>
>>
>
> Why are you joining to table3_nb?
> You do not use any fields from it.
>
> How do you know what data in table1_n_b to get?
> I see this grabbing the same information over and over again.


SELECT * INTO table3_n_b FROM (
        SELECT account_id, note_id, file_id FROM
        (
        SELECT DISTINCT ON
                (note_id) note_id,
                MAX(size),
                file_id,
                company_id
        FROM
                table1_n_b
        GROUP BY
                note_id, size, file_id, company_id
        ORDER BY
                note_id, size desc
        ) AS r1) AS r2;


Because I just wanna touch the greatest file_id ( by size ) of each note_id
And the file_id I must change is into the table3

That's why:

table3_n_b t3 ON t3.file_id = t1.file_id




>
>
>>
>>             UPDATE table2_y_b t2 SET segment_data =
>>
>>                 (
>>
>>                         SELECT
>>
>>                                 o1.data
>>
>>                         FROM
>>
>>                                 original_table1_b o1
>>
>>                         JOIN
>>
>>                                 table3_n_b t3 ON t3.file_id = o1.file_id
>>
>>                         WHERE
>>
>>                                 t2.migrated = 0
>>
>>                         AND
>>
>>                                 t2.file_id = o1.file_id
>>
>>                 );
>>
>>
>>             UPDATE table2_y_b SET migrated = 1 WHERE file_id =
>>             crtRow.file_id AND migrated = 0;
>>
>>
>>             UPDATE original_table1_b SET data = NULL WHERE file_id =
>>             crtRow.file_id;
>>
>
> All the above would seem to be handled in a LOOP.
> Grab the data from:
>
>         SELECT
>
>                             t1.note_id,
>
>                             t1.size,
>
>                             t1.file_id,
>
>                             t1.full_path
>
>                     FROM
>
>                             table1_n_b t1
>
> with suitable WHERE clause and use:
>
>
> https://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING


Hmm ok...  but...

INSERT INTO table2_y_b (note_id, size, file_id, full_path)

    (

            SELECT

                    t1.note_id,

                    t1.size,

                    t1.file_id,

                    t1.full_path

            FROM

                    table1_n_b t1

            JOIN

                    table3_n_b t3 ON t3.file_id = t1.file_id

    );


I don't need anything else on the WHERE clause , as the *ON t3.file_id =
t1.file_id* is already doing what I need....  ( and it works.. I tested it )



>
>
> to iterate over the results. As part of the iteration do your INSERT and
> UPDATE using the RECORD.file_id. This includes setting migrated=1 and
> data=NULL.
>

Yep.. that's the way I started by doing this...

Can you please tell me if this would be right?


CREATE or REPLACE FUNCTION function_data_1()

RETURNS INTEGER AS $$


declare

        row record;


BEGIN


-- copying the data to the backup table (not the blobs)

-- Limiting in 5000 rows each call

FOR row IN EXECUTE '

INSERT INTO table2_y_b (note_id, size, file_id, full_path)

    (

            SELECT

                    t1.note_id,

                    t1.size,

                    t1.file_id,

                    t1.full_path

            FROM

                    table1_n_b t1

            JOIN

                    table3_n_b t3 ON t3.file_id = t1.file_id

ORDER BY 1

LIMIT 5000

    )'


LOOP

-- copying the blobs to the table above

        UPDATE table2_y_b t2 SET segment_data =

        (

            SELECT

                    o1.data

            FROM

                    original_table1_b o1

            JOIN

                    table3_n_b t3 ON t3.file_id = o1.file_id

            WHERE

                    t2.migrated = 0

            AND

                    t2.file_id = o1.file_id

        )

        WHERE t2.file_id = row.file_id

END LOOP;


-- updating the migrated column from 0 to 1

LOOP

        UPDATE

                table2_y_b t2

        SET

                migrated = 1

        WHERE

                t2.file_id = row.file_id

        AND

                migrated = 0

END LOOP;


LOOP

        UPDATE

                original_table1_b o1

        SET

                data = NULL

        WHERE

                o1.file_id = row.file_id;

END LOOP;


END


$$ language 'plpgsql';


an.klaver@aklaver.c <adrian.kla...@aklaver.com>

Reply via email to