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?

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

Reply via email to