以下の様なSELECTを元に処理すればば良いかと思います。
カラムの並びを指定したい場合はarray_agg()(※9.21.集約関数)で指定します。
※行番号が1,2共に存在していることが前提です。(1の欠番が無い)
SQL
1with
2 tblA(主キー, カラムA, カラムB) as (
3 values ('001','グループ1','野菜')
4 ), tblB(主キー, 行番号, カラムC) as (
5 values ('001',1,'ごぼう'), ('001',2,'ほうれん草')
6 )
7select ta.*, tb.カラムagg[1] as カラムD, tb.カラムagg[2] as カラムE
8from tblA ta
9 inner join (
10 select 主キー, array_agg(カラムC order by 行番号) as カラムagg
11 from tblB
12 group by 主キー
13 ) tb
14 on ta.主キー=tb.主キー
※with部分はテーブルA,Bの値を指定している部分ですので、実際には省いて下さい。
質問ではinsertになっていますが、テーブルAに対して行うなら、updateですね。
SQL
1update tblA tgt set
2 カラムD=src.カラムagg[1]
3, カラムE=src.カラムagg[2]
4from (
5 select 主キー, array_agg(カラムC order by 行番号) as カラムagg
6 from tblB
7 group by 主キー
8 ) src
9where tgt.主キー=src.主キー
追加も更新も必要なら、insert into on conflict でupsertするのが効率良いかと思います。