Natural join uses the column names, you don't specify anything.
It is totally error prone for that reason.
ops$tkyte%ORA10GR2> create table t1 ( x int primary key, y int, z int );
Table created.
ops$tkyte%ORA10GR2> create table t2 ( x int primary key, y references t1, a int );
Table created.
<b>obviously, to join t1 to t2, you would use t1.x = t2.y, the primary/foreign key...</b>
ops$tkyte%ORA10GR2>
ops$tkyte%ORA10GR2> insert into t1 values ( 1, 1 , 100);
1 row created.
ops$tkyte%ORA10GR2> insert into t1 values ( 2, 2 , 200);
1 row created.
ops$tkyte%ORA10GR2>
ops$tkyte%ORA10GR2> insert into t2 values ( 1, 1 , 300);
1 row created.
ops$tkyte%ORA10GR2> insert into t2 values ( -2, 1 , 400);
1 row created.
ops$tkyte%ORA10GR2> insert into t2 values ( 2, 2 , 500);
1 row created.
ops$tkyte%ORA10GR2> insert into t2 values ( -4, 2 , 600);
1 row created.
ops$tkyte%ORA10GR2>
ops$tkyte%ORA10GR2> select * from t1 natural join t2;
X Y Z A
---------- ---------- ---------- ----------
1 1 100 300
2 2 200 500
<b>Hmmm..... </b>
ops$tkyte%ORA10GR2>
ops$tkyte%ORA10GR2> select * from t1 join t2 on (t1.x = t2.y);
X Y Z X Y A
---------- ---------- ---------- ---------- ---------- ----------
1 1 100 1 1 300
1 1 100 -2 1 400
2 2 200 2 2 500
2 2 200 -4 2 600
<b>oh, there we go</b>
You want to be specific, use the ANSI join if you like/want
Just do not use 'natural' join, you WANT to use column names explicitly.