Penjelasan
Subpilih dalam FROM
klausa UPDATE
. Anda mengembalikan tiga baris. Tetapi setiap baris dalam tabel target hanya dapat diperbarui sekali dalam satu UPDATE
memerintah. Hasilnya adalah Anda hanya melihat efek satu dari tiga baris itu.
Atau, dalam kata-kata manual :
Selain:jangan panggil subquery Anda "cte". Ini bukan Ekspresi Tabel Umum .
UPDATE
yang tepat
UPDATE table_ t
SET value_ = jsonb_set(value_, '{iProps}', sub2.new_prop, false)
FROM (
SELECT id
, jsonb_agg(jsonb_set(prop, '{value, rules}', new_rules, false)
ORDER BY idx1) AS new_prop
FROM (
SELECT t.id, arr1.prop, arr1.idx1
, jsonb_agg(jsonb_set(rule, '{ao,sc}', rule #> '{ao,sc,name}', false)
ORDER BY idx2) AS new_rules
FROM table_ t
, jsonb_array_elements(value_->'iProps') WITH ORDINALITY arr1(prop,idx1)
, jsonb_array_elements(prop->'value'->'rules') WITH ORDINALITY arr2(rule,idx2)
GROUP BY t.id, arr1.prop, arr1.idx1
) sub1
GROUP BY id
) sub2
WHERE t.id = sub2.id;
db<>fiddle di sini
Gunakan jsonb_set()
pada setiap objek (elemen array) sebelum menggabungkannya kembali ke dalam array. Pertama di tingkat daun, dan lagi di tingkat yang lebih dalam.
Saya menambahkan id
sebagai PRIMARY KEY
Ke meja. Kami membutuhkan beberapa kolom unik untuk memisahkan baris.
ORDER BY
. yang ditambahkan mungkin atau mungkin tidak diperlukan. Menambahkannya untuk menjamin pesanan asli.
Tentu saja, jika data Anda biasa seperti sampel, desain relasional dengan kolom khusus mungkin merupakan alternatif yang lebih sederhana. Lihat