Re: Problem with LEFT JOIN

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: "Thomas Wegner" <tomaten(at)t-online(dot)de>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: Problem with LEFT JOIN
Date: 2004-01-19 04:10:29
Message-ID: 20203.1074485429@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

"Thomas Wegner" <tomaten(at)t-online(dot)de> writes:
> Hello, whats wrong with this SQL?:

> SELECT L.*, A."lastname" AS firma_value, T."string_val1" AS type_value
> FROM "lists" L, "typecode" T
> LEFT JOIN "adressen" A ON A."id_adressen"=L."firma"
> WHERE T."id_typecode"=L."lists_type"
> ORDER BY L."id_lists"

> I get this:

> ERROR: relation "l" does not exist

The problem is in your ON clause: the above is equivalent to

SELECT ...
FROM "lists" L CROSS JOIN
("typecode" T LEFT JOIN "adressen" A ON A."id_adressen"=L."firma")
WHERE ...

so the ON clause is illegal because it controls the join of T and A,
in which L does not appear.

I have a sneaking suspicion that you are trying to port some MySQL code.
Last I heard, MySQL interprets the above FROM syntax as

FROM ("lists" L CROSS JOIN "typecode" T) LEFT JOIN "adressen" A ON A."id_adressen"=L."firma"

which makes the ON condition legal. Unfortunately for MySQL, their
parser is directly in violation of the SQL standard on this point.
JOIN is supposed to bind more tightly than comma.

regards, tom lane

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message Robert Creager 2004-01-19 04:28:34 How can I get the last element out of GROUP BY sets?
Previous Message Paul Hart 2004-01-19 02:58:38 Execute permissions for stored functions