Re: Postgres views cannot use both union and join/where

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>
Cc: Michael Lewis <mlewis(at)entrata(dot)com>, Mithran Kulasekaran <mithranakulasekaran(at)gmail(dot)com>, Pgsql Performance <pgsql-performance(at)lists(dot)postgresql(dot)org>
Subject: Re: Postgres views cannot use both union and join/where
Date: 2021-10-20 13:58:55
Message-ID: 2133339.1634738335@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

"David G. Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com> writes:
> On Tuesday, October 19, 2021, Michael Lewis <mlewis(at)entrata(dot)com> wrote:
>> On Tue, Oct 19, 2021 at 3:48 PM Mithran Kulasekaran <
>> mithranakulasekaran(at)gmail(dot)com> wrote:
>>> create view template_view (id, name, description, is_staged) as
>>> select t.id,t.name, t.description, false as is_staged
>>> from template t
>>> left join template_staging ts on t.name = ts.name and ts.name is null

>> Does that work? I've only seen that type of logic written as-
>> left join template_staging ts on t.name = ts.name
>> where ts.name is null

> The are functionally equivalent, though the timing of the expression
> evaluation differs slightly.

No, not at all. Michael's version correctly implements an anti-join,
where the first version does not. The reason is that the WHERE clause
"sees" the column value post-JOIN, whereas the JOIN/ON clause "sees"
values pre-JOIN.

Assuming that the '=' operator is strict, the first query's ON clause
really reduces to constant false, so that you just get a null-extended
image of the left table. That's almost surely not what's wanted.

regards, tom lane

In response to

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message David G. Johnston 2021-10-20 14:29:51 Re: Postgres views cannot use both union and join/where
Previous Message Ashkil Dighin 2021-10-20 10:51:38 Re: Lock contention high