下面的前两个查询是等效的。在连接的ON 子句中,表别名x 仅指使用该别名的最后一个表,因此只有employee 表受到限制。
在SELECT 和WHERE 表达式中,x 别名指的是这两个表 - 因此,如果列名是唯一的,那么它们可以被成功引用,但是如果列名相同,则 oracle 会引发 @987654331 @ 异常(如果评论被删除,则在查询 3 中发生)。
我找不到任何关于此的文档,但它看起来很像一个错误。
SQL Fiddle
Oracle 11g R2 架构设置:
CREATE TABLE employee (
company_id NUMBER(3),
employee_name VARCHAR2(20)
);
CREATE TABLE company (
company_id NUMBER(3),
company_name VARCHAR2(20)
);
INSERT INTO employee VALUES ( 4, 'Four Emp' );
INSERT INTO employee VALUES ( 5, 'Five Emp' );
INSERT INTO employee VALUES ( 6, 'Six Emp' );
INSERT INTO company VALUES ( 4, 'Four Company' );
INSERT INTO company VALUES ( 5, 'Five Company' );
INSERT INTO company VALUES ( 6, 'Six Company' );
查询 1:
SELECT *
FROM company x
JOIN
employee x
ON x.company_id = 5
Results:
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
查询 2:
SELECT *
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
Results:
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
查询 3:
SELECT --x.company_id,
x.company_name,
x.employee_name
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
Results:
| COMPANY_NAME | EMPLOYEE_NAME |
|--------------|---------------|
| Four Company | Five Emp |
| Five Company | Five Emp |
| Six Company | Five Emp |