Обсуждение: BUG #2549: problem with NATURAL JOIN
The following bug has been logged online:
Bug reference: 2549
Logged by: Kayteck
Email address: kayteck_master@o2.pl
PostgreSQL version: 8.1.3
Operating system: Fedora Core 4
Description: problem with NATURAL JOIN
Details:
I have two tables joined by foreign key id_przelewu, and for some rows
results of queries with NATURAL JOIN and JOIN ... USING (...) differs ! I've
readed that NATURAL JOIN is only shorthand for the second method, but this
results shows that's not true:
select id_zamowienia,id_przelewu from zamowienia where id_klienta=4999;
id_zamowienia | id_przelewu
---------------+-------------
7504 | 3095
7503 | 3095
7408 | 3095
(3 rows)
select id_przelewu from przelew where id_przelewu=3095;
id_przelewu
-------------
3095
(1 row)
select id_przelewu,id_zamowienia from zamowienia natural join przelew where
id_klienta=4999;
id_przelewu | id_zamowienia
-------------+---------------
(0 rows)
select id_przelewu,id_zamowienia from zamowienia join przelew using (id_p
rzelewu) where id_klienta=4999;
id_przelewu | id_zamowienia
-------------+---------------
3095 | 7504
3095 | 7503
3095 | 7408
(3 rows)
It seems for an error of postgresql
On Tue, 2006-07-25 at 00:58 +0000, Kayteck wrote: > I have two tables joined by foreign key id_przelewu, and for some rows > results of queries with NATURAL JOIN and JOIN ... USING (...) differs ! I've > readed that NATURAL JOIN is only shorthand for the second method, but this > results shows that's not true: NATURAL JOIN is shorthand for a USING () clause that mention *all* columns with matching names, so the meaning is slightly different. > select id_przelewu,id_zamowienia from zamowienia natural join przelew where > id_klienta=4999; > id_przelewu | id_zamowienia > -------------+--------------- > (0 rows) > > select id_przelewu,id_zamowienia from zamowienia join przelew using (id_p > rzelewu) where id_klienta=4999; > id_przelewu | id_zamowienia > -------------+--------------- > 3095 | 7504 > 3095 | 7503 > 3095 | 7408 > (3 rows) We cannot see whether this is a bug or not, since you have not provided the full descriptions of the two tables involved. Without those we cannot tell whether the NATURAL JOIN isn't shorthand for this... select id_przelewu,id_zamowienia from zamowienia join przelew using (id_przelewu, matching_name_col1, ...) where id_klienta=4999; and could therefore provide a different answer. -- Simon Riggs EnterpriseDB http://www.enterprisedb.com
"Kayteck" <kayteck_master@o2.pl> writes:
> I have two tables joined by foreign key id_przelewu, and for some rows
> results of queries with NATURAL JOIN and JOIN ... USING (...) differs ! I've
> readed that NATURAL JOIN is only shorthand for the second method, but this
> results shows that's not true:
Your two examples are not necessarily equivalent --- in particular, if
id_przelewu isn't the only common column name in the two tables then
NATURAL JOIN isn't equivalent to a join USING only id_przelewu.
I would guess that there's some other column the NATURAL JOIN is trying
to match, and there are no matches.
If you think there's an actual bug here, you need to exhibit a complete
test case, which this most certainly wasn't.
regards, tom lane
On Tue, Jul 25, 2006 at 12:58:55AM +0000, Kayteck wrote: > I have two tables joined by foreign key id_przelewu, and for some rows > results of queries with NATURAL JOIN and JOIN ... USING (...) differs ! I've > readed that NATURAL JOIN is only shorthand for the second method, but this > results shows that's not true: [...] > select id_przelewu,id_zamowienia from zamowienia natural join przelew where > id_klienta=4999; > id_przelewu | id_zamowienia > -------------+--------------- > (0 rows) Do zamowienia and przelew have column names in common in addition to id_przelewu? NATURAL JOIN uses all common column names, not just those specified in a foreign key constraint. http://www.postgresql.org/docs/8.1/interactive/queries-table-expressions.html#QUERIES-FROM "Finally, NATURAL is a shorthand form of USING: it forms a USING list consisting of exactly those column names that appear in both input tables." http://www.postgresql.org/docs/8.1/interactive/sql-select.html#SQL-FROM "NATURAL is shorthand for a USING list that mentions all columns in the two tables that have the same names." -- Michael Fuhr