Giải thích
Lựa chọn con trong FROM
mệnh đề UPDATE
của bạn trả về ba hàng. Nhưng mọi hàng trong bảng mục tiêu chỉ có thể được cập nhật một lần trong một UPDATE
duy nhất yêu cầu. Kết quả là bạn chỉ thấy tác dụng của một trong số ba hàng đó.
Hoặc, theo cách nói của hướng dẫn sử dụng :
Ngoài ra:không gọi truy vấn con của bạn là "cte". Nó không phải là Biểu thức bảng phổ biến .
UPDATE
thích hợp
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 tại đây
Sử dụng jsonb_set()
trên mỗi đối tượng (phần tử mảng) trước khi tổng hợp chúng lại thành một mảng. Đầu tiên ở cấp độ lá và một lần nữa ở cấp độ sâu hơn.
Tôi đã thêm id
dưới dạng PRIMARY KEY
để bàn. Chúng tôi cần một số cột duy nhất để giữ các hàng riêng biệt.
ORDER BY
được thêm vào có thể được yêu cầu hoặc không. Đã thêm nó để đảm bảo đơn đặt hàng ban đầu.
Tất nhiên, nếu dữ liệu của bạn đều đặn như mẫu, thì một thiết kế quan hệ với các cột chuyên dụng có thể là giải pháp thay thế đơn giản hơn. Xem