On Thu, Jan 16, 2014 at 5:21 AM, Rob Golsteijn <rob.golste...@mapscape.eu>wrote:

> Dear List,
>
> I came across a query with 2 LEFT JOINs of which the join clauses were
> mutually dependent.
> They did not produce the result I expected, but now I wonder if this is
> legal SQL in the first place.
>

PostgreSQL gives an error for the SQL below.  'missing FROM-clause entry
for table "b"'.

I think you should not refer to table B in the ON close of C LEFT JOIN A
since B is to the right of that join.


> I created a small example which illustrates the problem.
> The example tries to find Pythagorean Triples (i.e. integers a, b, and c
> for which holds a^2 + b^2 = c^2) for given set of possible values for a, b,
> and c.
> Note: that in my query the JOIN-clause of A refers to table B that is LEFT
> JOINed later, and the JOIN clause of B refers back to table A.
>
>
> .headers on
>
> .null <null>
> CREATE TABLE A (a INTEGER);
> CREATE TABLE B (b INTEGER);
> CREATE TABLE C (c INTEGER);
>
> INSERT INTO C VALUES(5);
>
> INSERT INTO A VALUES(1);
> INSERT INTO A VALUES(2);
> INSERT INTO A VALUES(3);
> INSERT INTO A VALUES(4);
> INSERT INTO A VALUES(5);
>
> INSERT INTO B VALUES(1);
> INSERT INTO B VALUES(2);
> INSERT INTO B VALUES(3);
> INSERT INTO B VALUES(4);
> INSERT INTO B VALUES(5);
>
> SELECT * FROM C
>     LEFT JOIN A ON A.a*A.a + B.b*B.b = C.c*c.c
>     LEFT JOIN B ON A.a*A.a + B.b*B.b = C.c*c.c;
> c|a|b
> 5|1|<null>
> 5|2|<null>
> 5|3|4
> 5|4|3
> 5|5|<null>
>
> When I look at the first result row and substitute that in the JOIN clause
> of A I get
>      1*1 + NULL*NULL= 5*5
> which is definitely not true since the lhs of the expression is NULL and
> the rhs 25.
> This made me wonder which value Sqlite uses for B.b when it is LEFT
> JOINing table A.
> It is appearantly not the value that is actually used when LEFT JOINing
> table B.
>
> I don't know exactly what to expect from Sqlite. Either
> (1) an error indicating that it is illegal to refer in the JOIN clause of
> a LEFT JOIN to a table that is LEFT JOINed later; or
> (2) only the result rows
>        c|a|b
>        5|3|4
>        5|4|3
> but neither of these options is the case. Is this valid SQL that Sqlite
> cannot handle or is this just invalid SQL?
> In the latter case it would be nice if SqLite complained about it).
>
>
>
> Rob Golsteijn
>
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>



-- 
D. Richard Hipp
d...@sqlite.org
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to