On Fri, Dec 09, 2011 at 01:12:26PM +0000, Fabrizio Steiner scratched on the wall: > Hello > > I'm currently facing a problem with nested right hand joins. I've also > reported this to the mailing list over one month ago, but haven't > received any reply. In the meantime I've investigated the problem in > the SQLite source and sorted some things out. > > Let's first start with an example which reproduces the problem: > > CREATE TABLE t1(t1_id INTEGER PRIMARY KEY, t1_title TEXT); > CREATE TABLE t2(t2_id INTEGER PRIMARY KEY, t2_title TEXT); > CREATE TABLE t3(t3_id INTEGER PRIMARY KEY, t3_title TEXT); > > INSERT INTO t1 (t1_id, t1_title) VALUES (888, 'data1'); > INSERT INTO t2 (t2_id, t2_title) VALUES (999, 'data2'); > INSERT INTO t3 (t3_id, t3_title) VALUES (999, 'data3'); > > Exeuting the following query works as expected and results?: > data1 | null | null > > SELECT t1_title, t2_title, t3_title > FROM t1 LEFT JOIN ( t2 INNER JOIN t3 ON t2_id = t3_id) ON t1_id = t2_id; > > If you now use the tablename t2 or t3 to access the columns like in the > following query?: > > SELECT t1_title, t2.t2_title, t3.t3_title > FROM t1 LEFT JOIN ( t2 INNER JOIN t3 ON t2_id = t3_id) ON t1_id = t2.t2_id; > > You will receive?SQL Error: no such column: t2.t2_title
If you name the result of the sub-join, making it a "top level" object, things work fine: SELECT t1_title, sub.t2_title, sub.t3_title FROM t1 LEFT JOIN ( t2 INNER JOIN t3 ON t2_id = t3_id ) AS sub ON t1_id = sub.t2_id; This avoids having to re-order the query, although I suppose it doesn't solve the problem of ambiguous column names in the sub-join. > This is perfectly fine if it's a subquery but if the subquery > represents a nested join it has to be possible to access the tables > used in the subquery. At least it's possible with all the database > systems I'm working with in daily business. Some SQL engines actually require sub-queries to be named. The columns lose their association with their source tables in a sub-query, so column level access required giving the result a name, not unlike I have done above. As you pointed out, that means that when the sub-join takes on the context of a full sub-query, the naming conventions follow, and that might be considered a bug. The system needs to distinguish between a sub-join converted to a sub-query and a full sub-query, however, and only allow "deeper" access for sub-joins (I didn't have a chance to review your patch to see if you account for this or not). Allowing access to sub-query result set columns via their source table names seems just as much a bug. -j -- Jay A. Kreibich < J A Y @ K R E I B I.C H > "Intelligence is like underwear: it is important that you have it, but showing it to the wrong people has the tendency to make them feel uncomfortable." -- Angela Johnson _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users