两表别名一致能做关联查询吗

按照正常的理解,一般是不能的,就像PostgreSQL

postgres=# create table t10(id1 int, name1 varchar(32));
CREATE TABLE
postgres=# create table t11(id2 int, name2 varchar(32));
CREATE TABLE
postgres=# insert into t10 values(1,'test1');
INSERT 0 1
postgres=# insert into t10 values(2,'test2');
INSERT 0 1
postgres=# insert into t11 values(1,'test3');
INSERT 0 1
postgres=# select bc.name2 from t10 bc left join t11 bc on bc.id1 = bc.id2;
ERROR:  table name "bc" specified more than once
postgres=# 

但是Oracle不一样,它还真能执行,执行结果如下

SQL> create table t10(id1 int, name1 varchar2(32));

Table created.

SQL> create table t11(id2 int, name2 varchar2(32));

Table created.

SQL> insert into t10 values(1,'test1');

1 row created.

SQL> insert into t10 values(2,'test2');

1 row created.

SQL> insert into t11 values(1,'test3');

1 row created.

SQL> EXPLAIN PLAN FOR select bc.name2 from t10 bc left join t11 bc on bc.id1 = bc.id2;

Explained.

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1151093956

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     2 |    88 |     6   (0)| 00:00:01 |
|*  1 |  HASH JOIN OUTER   |      |     2 |    88 |     6   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| T10  |     2 |    26 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| T11  |     1 |    31 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("BC"."ID1"="BC"."ID2"(+))

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

19 rows selected.

SQL> select bc.name2 from t10 bc left join t11 bc on bc.id1 = bc.id2;

NAME2
--------------------------------------------------------------------------------
test3


SQL> 

想不通oracle为什么要支持这种写法,此处用作记录~

❤️ 转载文章请注明出处,谢谢!❤️