Re: Incorrect result in certain expressions of anti-join - Mailing list pgsql-bugs

From David G. Johnston
Subject Re: Incorrect result in certain expressions of anti-join
Date
Msg-id CAKFQuwbLzWXVfZh1zaoMV1eNUKgyuzcNOYtdbqtd14S6hu0Omw@mail.gmail.com
Whole thread Raw
In response to Incorrect result in certain expressions of anti-join  (Torbjörn Gannholm <torbjorn.gannholm@gmail.com>)
List pgsql-bugs
On Tuesday, January 7, 2025, Torbjörn Gannholm <torbjorn.gannholm@gmail.com> wrote:

select * from bar LEFT JOIN foo ON foo.a = bar.a WHERE foo.a IS NULL;
select * from bar LEFT JOIN foo ON foo.a = bar.a AND foo.a IS NULL;


The where clause is evaluated after the join and thus the join sees all rows from foo and bar.

When you place the expression in the ON clause it gets evaluated before/during the join, and thus effectively pushed down and the rows of foo are filtered before the join happens.

Separately, I would advise using NOT EXISTS for an anti-join and not mention foo in the from clause at all.  That is the canonical form.

David J.

pgsql-bugs by date:

Previous
From: Pantelis Theodosiou
Date:
Subject: Re: Incorrect result in certain expressions of anti-join
Next
From: Thomas Munro
Date:
Subject: Re: BUG #18146: Rows reappearing in Tables after Auto-Vacuum Failure in PostgreSQL on Windows