public inbox for [email protected]  
help / color / mirror / Atom feed
Re: Left join syntax error
6+ messages / 4 participants
[nested] [flat]

* Re: Left join syntax error
@ 2024-05-18 15:00 Erik Wienhold <[email protected]>
  2024-05-18 15:12 ` Re: Left join syntax error David G. Johnston <[email protected]>
  2024-05-18 15:14 ` Re: Left join syntax error Erik Wienhold <[email protected]>
  2024-05-18 15:16 ` Re: Left join syntax error Tom Lane <[email protected]>
  2024-05-18 15:18 ` Re: Left join syntax error Rich Shepard <[email protected]>
  0 siblings, 4 replies; 6+ messages in thread

From: Erik Wienhold @ 2024-05-18 15:00 UTC (permalink / raw)
  To: Shammat <[email protected]>; +Cc: [email protected]

On 2024-05-18 15:19 +0200, Shammat wrote:
> Am 18.05.24 um 14:52 schrieb Rich Shepard:
> > It's been a _very_ long time since I wrote a SQL script and, despite looking
> > at my SQL books and web pages, I don't know how to fix the error.
> > 
> > The three line script is:
> > -----
> > SELECT p.lname, p.fname, p.job_title, p.company_nbr, p.email, c.company_name
> >    FROM people as p, companies as c
> > LEFT JOIN companies ON c.company_nbr = p.company_nbr;
> > -----
> > 
> > and psql responds:
> > ERROR:  invalid reference to FROM-clause entry for table "p"
> > LINE 3: LEFT JOIN companies ON c.company_nbr = p.company_nbr;
> >                                                 ^
> > HINT:  There is an entry for table "p", but it cannot be referenced from this part of the query.
> 
> Don't put the second table in the FROM part
> 
> SELECT p.lname, p.fname, p.job_title, p.company_nbr, p.email, c.company_name
> FROM people as p
>   LEFT JOIN companies as c ON c.company_nbr = p.company_nbr

Yes, Rich probably just wants the left join.

But I wonder if the implicit cross join syntax ("FROM peoples, companies")
should actually produce this error because the explicit cross join
works:

    SELECT p.lname, p.fname, p.job_title, p.company_nbr, p.email, c.company_name
    FROM people as p
        CROSS JOIN companies as c
        LEFT JOIN companies ON c.company_nbr = p.company_nbr;

But I'm not even sure if implicit and explicit cross join are
semantically equivalent.  The docs on FROM [1] sort of imply that:

"If multiple sources are specified, the result is the Cartesian product
 (cross join) of all the sources."

Maybe it's only meant that both syntaxes are equivalent regarding the
result, and that it does not extend to aliases of those FROM items.

If you just move the LEFT JOIN condition to the WHERE clause it works as
well, which indicates that the aliases from the implicit cross join do
work as if it has been an explicit cross join:

    SELECT p.lname, p.fname, p.job_title, p.company_nbr, p.email, c.company_name
    FROM people as p, companies as c
        LEFT JOIN companies ON true
    WHERE c.company_nbr = p.company_nbr;

[1] https://www.postgresql.org/docs/current/sql-select.html#SQL-FROM

-- 
Erik






^ permalink  raw  reply  [nested|flat] 6+ messages in thread

* Re: Left join syntax error
  2024-05-18 15:00 Re: Left join syntax error Erik Wienhold <[email protected]>
@ 2024-05-18 15:12 ` David G. Johnston <[email protected]>
  2024-05-18 15:30   ` Re: Left join syntax error Erik Wienhold <[email protected]>
  3 siblings, 1 reply; 6+ messages in thread

From: David G. Johnston @ 2024-05-18 15:12 UTC (permalink / raw)
  To: Erik Wienhold <[email protected]>; +Cc: Shammat <[email protected]>; [email protected] <[email protected]>

On Saturday, May 18, 2024, Erik Wienhold <[email protected]> wrote:

> On 2024-05-18 15:19 +0200, Shammat wrote:
> > Am 18.05.24 um 14:52 schrieb Rich Shepard:
> > > It's been a _very_ long time since I wrote a SQL script and, despite
> looking
> > > at my SQL books and web pages, I don't know how to fix the error.
> > >
> > > The three line script is:
> > > -----
> > > SELECT p.lname, p.fname, p.job_title, p.company_nbr, p.email,
> c.company_name
> > >    FROM people as p, companies as c
> > > LEFT JOIN companies ON c.company_nbr = p.company_nbr;
> > > -----
> > >
> > > and psql responds:
> > > ERROR:  invalid reference to FROM-clause entry for table "p"
> > > LINE 3: LEFT JOIN companies ON c.company_nbr = p.company_nbr;
> > >                                                 ^
> > > HINT:  There is an entry for table "p", but it cannot be referenced
> from this part of the query.
> >
> > Don't put the second table in the FROM part
> >
> > SELECT p.lname, p.fname, p.job_title, p.company_nbr, p.email,
> c.company_name
> > FROM people as p
> >   LEFT JOIN companies as c ON c.company_nbr = p.company_nbr
>
> Yes, Rich probably just wants the left join.
>
> But I wonder if the implicit cross join syntax ("FROM peoples, companies")
> should actually produce this error because the explicit cross join
> works:
>
>     SELECT p.lname, p.fname, p.job_title, p.company_nbr, p.email,
> c.company_name
>     FROM people as p
>         CROSS JOIN companies as c
>         LEFT JOIN companies ON c.company_nbr = p.company_nbr;
>
> But I'm not even sure if implicit and explicit cross join are
> semantically equivalent.  The docs on FROM [1] sort of imply that:
>

Too lazy to find the docs right now but what you are observing is basically
an operator precedence effect.  The comma join hasn’t happened at the time
the left join is evaluated and so other tables in the comma join cannot
appear in the on clause of the left join.  Placing everything inside a
single from slot and moving the conditions to the where clause removes
changes the precedence aspect so that the cross join does indeed evaluate
prior to the left join.

I’m content with not pointing out this possible gotcha in the documentation.

David J.


^ permalink  raw  reply  [nested|flat] 6+ messages in thread

* Re: Left join syntax error
  2024-05-18 15:00 Re: Left join syntax error Erik Wienhold <[email protected]>
  2024-05-18 15:12 ` Re: Left join syntax error David G. Johnston <[email protected]>
@ 2024-05-18 15:30   ` Erik Wienhold <[email protected]>
  0 siblings, 0 replies; 6+ messages in thread

From: Erik Wienhold @ 2024-05-18 15:30 UTC (permalink / raw)
  To: David G. Johnston <[email protected]>; +Cc: Shammat <[email protected]>; [email protected] <[email protected]>

On 2024-05-18 17:12 +0200, David G. Johnston wrote:
> Too lazy to find the docs right now but what you are observing is basically
> an operator precedence effect.  The comma join hasn’t happened at the time
> the left join is evaluated and so other tables in the comma join cannot
> appear in the on clause of the left join.  Placing everything inside a
> single from slot and moving the conditions to the where clause removes
> changes the precedence aspect so that the cross join does indeed evaluate
> prior to the left join.

Thanks David.  The docs on table expressions clarify the precedence:

https://www.postgresql.org/docs/16/queries-table-expressions.html#QUERIES-FROM

I'm using SQL for 17 years now and yet I still forget that joins are
table expressions m(

-- 
Erik






^ permalink  raw  reply  [nested|flat] 6+ messages in thread

* Re: Left join syntax error
  2024-05-18 15:00 Re: Left join syntax error Erik Wienhold <[email protected]>
@ 2024-05-18 15:14 ` Erik Wienhold <[email protected]>
  3 siblings, 0 replies; 6+ messages in thread

From: Erik Wienhold @ 2024-05-18 15:14 UTC (permalink / raw)
  To: Shammat <[email protected]>; +Cc: [email protected]

I wrote:
> But I wonder if the implicit cross join syntax ("FROM peoples, companies")
> should actually produce this error because the explicit cross join
> works:
> 
>     SELECT p.lname, p.fname, p.job_title, p.company_nbr, p.email, c.company_name
>     FROM people as p
>         CROSS JOIN companies as c
>         LEFT JOIN companies ON c.company_nbr = p.company_nbr;

On second thought it looks like that (companies as c LEFT JOIN companies)
actually is the second FROM item.  Adding parenthesis to the explicit
cross join version gives the same error:

    SELECT p.lname, p.fname, p.job_title, p.company_nbr, p.email, c.company_name
    FROM people as p
        CROSS JOIN (
            companies as c
            LEFT JOIN companies ON c.company_nbr = p.company_nbr
        );

So the comma in the FROM item list has lower precedence than the join
operators.

-- 
Erik






^ permalink  raw  reply  [nested|flat] 6+ messages in thread

* Re: Left join syntax error
  2024-05-18 15:00 Re: Left join syntax error Erik Wienhold <[email protected]>
@ 2024-05-18 15:16 ` Tom Lane <[email protected]>
  3 siblings, 0 replies; 6+ messages in thread

From: Tom Lane @ 2024-05-18 15:16 UTC (permalink / raw)
  To: Erik Wienhold <[email protected]>; +Cc: Shammat <[email protected]>; [email protected]

Erik Wienhold <[email protected]> writes:
> But I wonder if the implicit cross join syntax ("FROM peoples, companies")
> should actually produce this error because the explicit cross join
> works:

>     SELECT p.lname, p.fname, p.job_title, p.company_nbr, p.email, c.company_name
>     FROM people as p
>         CROSS JOIN companies as c
>         LEFT JOIN companies ON c.company_nbr = p.company_nbr;

> But I'm not even sure if implicit and explicit cross join are
> semantically equivalent.

Well, they do the same thing, but JOIN binds tighter than comma.
So in one case you have effectively

    FROM people as p CROSS JOIN
         (companies as c LEFT JOIN companies ON c.company_nbr = p.company_nbr)

and "p" is not within the scope of the JOIN/ON clause.
The other way is effectively

    FROM (people as p CROSS JOIN companies as c)
         LEFT JOIN companies ON c.company_nbr = p.company_nbr;

which is syntactically legal, although it probably doesn't do
what you wanted.

If memory serves, MySQL got this basic syntactic detail wrong
for years, as a result of which there's (still) a tremendous amount
of confusion on the net about what is the syntactic precedence in
FROM clauses.

			regards, tom lane






^ permalink  raw  reply  [nested|flat] 6+ messages in thread

* Re: Left join syntax error
  2024-05-18 15:00 Re: Left join syntax error Erik Wienhold <[email protected]>
@ 2024-05-18 15:18 ` Rich Shepard <[email protected]>
  3 siblings, 0 replies; 6+ messages in thread

From: Rich Shepard @ 2024-05-18 15:18 UTC (permalink / raw)
  To: [email protected]

On Sat, 18 May 2024, Erik Wienhold wrote:

> Yes, Rich probably just wants the left join.

Eric,

You're correct: I want certain colums from the people table with their
company name from the companies table.

> But I wonder if the implicit cross join syntax ("FROM peoples, companies")
> should actually produce this error because the explicit cross join
> works:
>
>    SELECT p.lname, p.fname, p.job_title, p.company_nbr, p.email, c.company_name
>    FROM people as p
>        CROSS JOIN companies as c
>        LEFT JOIN companies ON c.company_nbr = p.company_nbr;

Aha! I ignored the cross join because I don't need all columns from both
tables. And it worked here (slowly) with a Ryzen7 2700 CPU and 64G RAM.

> If you just move the LEFT JOIN condition to the WHERE clause it works as
> well, which indicates that the aliases from the implicit cross join do
> work as if it has been an explicit cross join:
>
>    SELECT p.lname, p.fname, p.job_title, p.company_nbr, p.email, c.company_name
>    FROM people as p, companies as c
>        LEFT JOIN companies ON true
>    WHERE c.company_nbr = p.company_nbr;

This didn't work as well; too many repeats for each row in people.

Thank you for a valuable lesson, Eric.

Best regards,

Rich






^ permalink  raw  reply  [nested|flat] 6+ messages in thread


end of thread, other threads:[~2024-05-18 15:30 UTC | newest]

Thread overview: 6+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2024-05-18 15:00 Re: Left join syntax error Erik Wienhold <[email protected]>
2024-05-18 15:12 ` David G. Johnston <[email protected]>
2024-05-18 15:30   ` Erik Wienhold <[email protected]>
2024-05-18 15:14 ` Erik Wienhold <[email protected]>
2024-05-18 15:16 ` Tom Lane <[email protected]>
2024-05-18 15:18 ` Rich Shepard <[email protected]>

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox