diff --git a/odoo/addons/base/tests/test_expression.py b/odoo/addons/base/tests/test_expression.py index dafd2583d8d..45b1cfe976d 100644 --- a/odoo/addons/base/tests/test_expression.py +++ b/odoo/addons/base/tests/test_expression.py @@ -1673,9 +1673,10 @@ class TestOne2many(TransactionCase): with self.assertQueries([''' SELECT "res_partner".id FROM "res_partner" - WHERE ("res_partner"."id" IN ( - SELECT "partner_id" FROM "res_partner_bank" WHERE "partner_id" IS NOT NULL - )) + WHERE EXISTS ( + SELECT 1 FROM "res_partner_bank" AS "res_partner__bank_ids" + WHERE "res_partner__bank_ids"."partner_id" = "res_partner".id + ) ORDER BY "res_partner"."id" ''']): self.Partner.search([('bank_ids', '!=', False)], order='id') @@ -1683,9 +1684,10 @@ class TestOne2many(TransactionCase): with self.assertQueries([''' SELECT "res_partner".id FROM "res_partner" - WHERE ("res_partner"."id" NOT IN ( - SELECT "partner_id" FROM "res_partner_bank" WHERE "partner_id" IS NOT NULL - )) + WHERE NOT EXISTS ( + SELECT 1 FROM "res_partner_bank" AS "res_partner__bank_ids" + WHERE "res_partner__bank_ids"."partner_id" = "res_partner".id + ) ORDER BY "res_partner"."id" ''']): self.Partner.search([('bank_ids', '=', False)], order='id') diff --git a/odoo/osv/expression.py b/odoo/osv/expression.py index be9ce5f3de4..a1d03437dba 100644 --- a/odoo/osv/expression.py +++ b/odoo/osv/expression.py @@ -809,9 +809,14 @@ class expression(object): else: if inverse_field.store and not (inverse_is_int and domain): # rewrite condition to match records with/without lines - op1 = 'inselect' if operator in NEGATIVE_TERM_OPERATORS else 'not inselect' - subquery = f'SELECT "{inverse_field.name}" FROM "{comodel._table}" WHERE "{inverse_field.name}" IS NOT NULL' - push(('id', op1, (subquery, [])), model, alias, internal=True) + exists = 'EXISTS' if operator in NEGATIVE_TERM_OPERATORS else 'NOT EXISTS' + rel_alias = _generate_table_alias(alias, field.name) + push_result(f""" + {exists} ( + SELECT 1 FROM "{comodel._table}" AS "{rel_alias}" + WHERE "{rel_alias}"."{inverse_field.name}" = "{alias}".id + ) + """, []) else: comodel_domain = [(inverse_field.name, '!=', False)] if inverse_is_int and domain: