Jeremy Evans wrote:
> After being open for more than 2 years, this ticket
> (http://www.sqlite.org/src/tktview/3338b3fa19ac4abee6c475126a2e6d9d61f26ab1)
> was closed by Dr. Hipp with the comment:
> 
> "The column name is ambiguous. Does it mean a.a or b.a? The result is
> the same either way, but I don't expect the parser to know this."
> 
> Here's the SQL from the ticket:
> 
> 1) CREATE TABLE a (a INTEGER);
> 2) CREATE TABLE b (a INTEGER);
> 3) CREATE TABLE c (a INTEGER);
> 4) SELECT * FROM a JOIN b USING (a);
> 5) SELECT * FROM a JOIN b USING (a) JOIN c USING (a);
> 6) SELECT * FROM a JOIN b USING (a) WHERE a = 1;
> 7) SELECT * FROM a JOIN b USING (a) JOIN c USING (a) WHERE a = 1;
> 
> Note that SQLite only considers statement 7 invalid.  If column a was
> really ambiguous, statement 6 should also be invalid, but it is not.
> If Dr. Hipp's statement was correct, SQLite should consider statement
> 6 invalid as well.  The error is obviously in the predicate in
> statement 7 and not in the USING clause, since statement 5 is
> considered valid.
>
> I don't think column a in the predicate should be ambiguous in either
> statement 6 or 7, and it isn't on any other database I've tried that
> supports JOIN USING.  The columns in the USING clause (<join column
> list> in the SQL 2003 standard) are supposed to be treated as if they
> were a single column shared by both tables.  The SQL 2003 standard
> covers this in ISO/IEC 9075-2:2003 (E) Section 7.7 <joined table>,
> where it explains that statement 6 should be treated as:
> 
> SELECT coalesce(a.a, b.a) AS a FROM a, b WHERE a.a = b.a AND a = 1
> 
> It doesn't explicitly give an example of a three table JOIN USING, but
> intuitively the columns in the USING clause shouldn't be ambiguous in
> the three table case if they aren't in the two table case.
> 
> This combining of columns from multiple tables and treating them as a
> single column is reflected in the output of Statements 4-6, which only
> include a single column and not a column from each table.
> 
> I would reopen the ticket to ask for an explanation, but that does not
> appear to be possible, which is why I'm asking here.  Can someone
> explain whether they think SQLite's current behavior for this case is
> correct, and why?

... and according to sqlite documentation:
=== begin quote lang_select.html ===
    For each pair of columns identified by a USING clause, the column from the
    right-hand dataset is omitted from the joined dataset. This is the only
    difference between a USING clause and its equivalent ON constraint.
=== end quote ===
So, I agree - "a" IMO, *should not* be ambiguous - with USING/NATURAL JOIN "a"
without qualifiers should expand to (only) LHS a, that is - a.a.

BTW, I've seen same effect with ORDER BY, but only in specific conditions
(I renamed here "a" field to "i" to reduce possible confusion with table name):

8) SELECT * FROM a JOIN b USING (i) ORDER BY i; -- works
9) SELECT 1 FROM a JOIN b USING (i) ORDER BY i; -- works
10) SELECT * FROM a JOIN b USING (i) JOIN c USING (i) ORDER BY i; -- works
11) SELECT 1 FROM a JOIN b USING (i) JOIN c USING (i) ORDER BY i; -- FAILS!
Error: ambiguous column name: i
12) SELECT a.i FROM a JOIN b USING (i) JOIN c USING (i) ORDER BY i; -- FAILS!
Error: ambiguous column name: i
12) SELECT a.i AS i FROM a JOIN b USING (i) JOIN c USING (i) ORDER BY i; --works

Exactly same effect with GROUP BY.

This is certainly bug. Either it should fail every time (in 6--11), or it should
work in all cases.

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

Reply via email to