diff --git a/addons/account/models/account_account.py b/addons/account/models/account_account.py
index e0750616d9362b31bbd3e05aae3ace27910a387f..05317a8a2517d90fe83f6d4b6c53c7201a77474b 100644
--- a/addons/account/models/account_account.py
+++ b/addons/account/models/account_account.py
@@ -617,16 +617,23 @@ class AccountGroup(models.Model):
         """
         if not self and not account_ids:
             return
-        self.env['account.group'].flush()
-        self.env['account.account'].flush()
+        self.env['account.group'].flush(self.env['account.group']._fields)
+        self.env['account.account'].flush(self.env['account.account']._fields)
         query = """
-            UPDATE account_account account SET group_id = (
-                SELECT agroup.id FROM account_group agroup
-                WHERE agroup.code_prefix_start <= LEFT(account.code, char_length(agroup.code_prefix_start))
-                AND agroup.code_prefix_end >= LEFT(account.code, char_length(agroup.code_prefix_end))
-                AND agroup.company_id = account.company_id
-                ORDER BY char_length(agroup.code_prefix_start) DESC LIMIT 1
-            ) WHERE account.company_id in %(company_ids)s {where_account};
+            WITH relation AS (
+       SELECT DISTINCT FIRST_VALUE(agroup.id) OVER (PARTITION BY account.id ORDER BY char_length(agroup.code_prefix_start) DESC, agroup.id) AS group_id,
+                       account.id AS account_id
+                  FROM account_group agroup
+                  JOIN account_account account
+                    ON agroup.code_prefix_start <= LEFT(account.code, char_length(agroup.code_prefix_start))
+                   AND agroup.code_prefix_end >= LEFT(account.code, char_length(agroup.code_prefix_end))
+                   AND agroup.company_id = account.company_id
+                 WHERE account.company_id IN %(company_ids)s {where_account}
+            )
+            UPDATE account_account account
+               SET group_id = relation.group_id
+              FROM relation
+             WHERE relation.account_id = account.id;
         """.format(
             where_account=account_ids and 'AND account.id IN %(account_ids)s' or ''
         )
@@ -642,21 +649,28 @@ class AccountGroup(models.Model):
         """
         if not self:
             return
-        self.env['account.group'].flush()
+        self.env['account.group'].flush(self.env['account.group']._fields)
         query = """
-            UPDATE account_group agroup SET parent_id = (
-                SELECT parent.id FROM account_group parent
-                WHERE char_length(parent.code_prefix_start) < char_length(agroup.code_prefix_start)
-                AND parent.code_prefix_start <= LEFT(agroup.code_prefix_start, char_length(parent.code_prefix_start))
-                AND parent.code_prefix_end >= LEFT(agroup.code_prefix_end, char_length(parent.code_prefix_end))
-                AND parent.id != agroup.id
-                AND parent.company_id = %(company_id)s
-                ORDER BY char_length(parent.code_prefix_start) DESC LIMIT 1
-            ) WHERE agroup.company_id = %(company_id)s;
+            WITH relation AS (
+       SELECT DISTINCT FIRST_VALUE(parent.id) OVER (PARTITION BY child.id ORDER BY child.id, char_length(parent.code_prefix_start) DESC) AS parent_id,
+                       child.id AS child_id
+                  FROM account_group parent
+                  JOIN account_group child
+                    ON char_length(parent.code_prefix_start) < char_length(child.code_prefix_start)
+                   AND parent.code_prefix_start <= LEFT(child.code_prefix_start, char_length(parent.code_prefix_start))
+                   AND parent.code_prefix_end >= LEFT(child.code_prefix_end, char_length(parent.code_prefix_end))
+                   AND parent.id != child.id
+                   AND parent.company_id = child.company_id
+                 WHERE child.company_id IN %(company_ids)s
+            )
+            UPDATE account_group child
+               SET parent_id = relation.parent_id
+              FROM relation
+             WHERE child.id = relation.child_id;
         """
-        self.env.cr.execute(query, {'company_id': self.company_id.id})
+        self.env.cr.execute(query, {'company_ids': tuple(self.company_id.ids)})
         self.env['account.group'].invalidate_cache(fnames=['parent_id'])
-        self.env['account.group'].search([('company_id', '=', self.company_id.id)])._parent_store_update()
+        self.env['account.group'].search([('company_id', 'in', self.company_id.ids)])._parent_store_update()
 
 
 class AccountRoot(models.Model):