WITH updated_data AS ( SELECT "id", packing_num, (packing_num - (SELECT COUNT(1) FROM wms_shipment_material_code_item_qr WHERE item_id = wms_shipment_material_code_item."id" AND status = 1)) as new_packing_left FROM wms_shipment_material_code_item ) UPDATE wms_shipment_material_code_item t SET packing_left = u.new_packing_left, status = CASE WHEN u.new_packing_left = 0 THEN 2 WHEN u.new_packing_left=u.packing_num THEN 0 ELSE 1 END FROM updated_data u WHERE t."id" = u."id" and t."id" IN #{id}