Re: [SQL] table aliasing problem with 6.5... - Mailing list pgsql-sql
From | Bruce Momjian |
---|---|
Subject | Re: [SQL] table aliasing problem with 6.5... |
Date | |
Msg-id | 199909271744.NAA09308@candle.pha.pa.us Whole thread Raw |
In response to | Re: [SQL] table aliasing problem with 6.5... (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: [SQL] table aliasing problem with 6.5...
|
List | pgsql-sql |
> Howie <caffeine@toodarkpark.org> writes: > > (1) why is it trying to do a cartesian join when not using the aliased > > tables? > > That's what it's supposed to do. When you provide an alias for a table > name in FROM, then as far as the rest of that query is concerned, that > alias *is* the name of the table --- it has no other. When you refer > to the original table name in the WHERE clause, that's taken as creating > a separate table reference that's implicitly added to FROM. Your query > is a four-way join with only one join having a restriction clause :-( > > The alias behavior is necessary in order to handle self-joins properly, > for example to find married couples: > SELECT * FROM person, person other WHERE person.spouse = other.spouse; > This would be ambiguous if "person" were exposed by the second FROM clause. > SQL92 requires it to work this way: > > <table reference> ::= > <table name> [ [ AS ] <correlation name> > [ <left paren> <derived column list> <right paren> ] ] > > ... > > 1) A <correlation name> immediately contained in a <table refer- > ence> TR is exposed by TR. A <table name> immediately contained > in a <table reference> TR is exposed by TR if and only if TR > does not specify a <correlation name>. > > > I think that implicitly adding a table to FROM is a Postgres extension > not found in SQL92 --- we probably really ought to reject such a query > with an error, since this behavior seems to be surprising... OK, I have added an elog(NOTICE) for this behavior:test=> select * from pg_language;lanname |lanispl|lanpltrusted|lanplcallfoid|lancompiler --------+-------+------------+-------------+--------------internal|f |f | 0|n/a lisp |f |f | 0|/usr/ucb/lisztC |f |f | 0|/bin/cc sql |f |f | 0|postgres (4 rows)test=> selectpg_language.*; --> NOTICE: Auto-creating query reference to table pg_languagelanname |lanispl|lanpltrusted|lanplcallfoid|lancompiler --------+-------+------------+-------------+--------------internal|f |f | 0|n/a lisp |f |f | 0|/usr/ucb/lisztC |f |f | 0|/bin/cc sql |f |f | 0|postgres (4 rows) I am interested in comments about my wording, and this behavour. -- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026