一次选择中的Oracle SQL非唯一表别名
有人知道为什么这两个表别名都是“x”吗 我知道id为5的连接没有意义一次选择中的Oracle SQL非唯一表别名,sql,oracle,select,alias,Sql,Oracle,Select,Alias,有人知道为什么这两个表别名都是“x”吗 我知道id为5的连接没有意义 谢谢你的课 我会把钱花在“Oracle bug”上——在所有阻碍我采用ANSI JOIN语法的因素中,Oracle的这种令人痛苦的、充满bug的实现。也就是说,“未能捕捉到语法错误”是很小的问题,据我所知,Oracle已经基本上清理了他们的行为。下面的前两个查询是等效的。在join的ON子句中,表别名x仅指最后一个使用该别名的表,因此只有employee表受到限制 在选择和其中表达式中,x别名引用两个表-因此,如果列名是唯一的
谢谢你的课 我会把钱花在“Oracle bug”上——在所有阻碍我采用ANSI JOIN语法的因素中,Oracle的这种令人痛苦的、充满bug的实现。也就是说,“未能捕捉到语法错误”是很小的问题,据我所知,Oracle已经基本上清理了他们的行为。下面的前两个查询是等效的。在join的
ON
子句中,表别名x
仅指最后一个使用该别名的表,因此只有employee
表受到限制
在选择和其中表达式中,x
别名引用两个表-因此,如果列名是唯一的,则可以成功引用它们,但如果列名相同,则oracle会引发ORA-00918:定义不明确的列异常(如查询3中删除注释时所发生的情况)
我找不到关于这个的任何文档,但它看起来很像一个bug
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' );
SELECT *
FROM company x
JOIN
employee x
ON x.company_id = 5
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT *
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT --x.company_id,
x.company_name,
x.employee_name
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_NAME | EMPLOYEE_NAME |
|--------------|---------------|
| Four Company | Five Emp |
| Five Company | Five Emp |
| Six Company | Five Emp |
查询1:
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' );
SELECT *
FROM company x
JOIN
employee x
ON x.company_id = 5
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT *
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT --x.company_id,
x.company_name,
x.employee_name
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_NAME | EMPLOYEE_NAME |
|--------------|---------------|
| Four Company | Five Emp |
| Five Company | Five Emp |
| Six Company | Five Emp |
:
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' );
SELECT *
FROM company x
JOIN
employee x
ON x.company_id = 5
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT *
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT --x.company_id,
x.company_name,
x.employee_name
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_NAME | EMPLOYEE_NAME |
|--------------|---------------|
| Four Company | Five Emp |
| Five Company | Five Emp |
| Six Company | Five Emp |
查询2:
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' );
SELECT *
FROM company x
JOIN
employee x
ON x.company_id = 5
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT *
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT --x.company_id,
x.company_name,
x.employee_name
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_NAME | EMPLOYEE_NAME |
|--------------|---------------|
| Four Company | Five Emp |
| Five Company | Five Emp |
| Six Company | Five Emp |
:
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' );
SELECT *
FROM company x
JOIN
employee x
ON x.company_id = 5
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT *
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT --x.company_id,
x.company_name,
x.employee_name
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_NAME | EMPLOYEE_NAME |
|--------------|---------------|
| Four Company | Five Emp |
| Five Company | Five Emp |
| Six Company | Five Emp |
查询3:
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' );
SELECT *
FROM company x
JOIN
employee x
ON x.company_id = 5
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT *
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT --x.company_id,
x.company_name,
x.employee_name
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_NAME | EMPLOYEE_NAME |
|--------------|---------------|
| Four Company | Five Emp |
| Five Company | Five Emp |
| Six Company | Five Emp |
:
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' );
SELECT *
FROM company x
JOIN
employee x
ON x.company_id = 5
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT *
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_ID | COMPANY_NAME | EMPLOYEE_NAME |
|------------|--------------|---------------|
| 5 | Four Company | Five Emp |
| 5 | Five Company | Five Emp |
| 5 | Six Company | Five Emp |
SELECT --x.company_id,
x.company_name,
x.employee_name
FROM company x
CROSS JOIN
(SELECT * FROM employee WHERE company_id = 5) x
| COMPANY_NAME | EMPLOYEE_NAME |
|--------------|---------------|
| Four Company | Five Emp |
| Five Company | Five Emp |
| Six Company | Five Emp |
company\u id
是唯一的列吗?谢谢你的快速回答。我认为这没关系。我想知道为什么我可以使用同一个别名“x”两次。比如,在公司上它是唯一的,在员工上不是。关系是“公司有很多员工”。我的意思是,如果列名(公司名称
,员工姓名
和公司id
)都是唯一的,所以它们只存在于两个表中的一个表中,别名并不重要。我编写了一个测试用例,其中两个表都有company\u id
,查询运行正常。我只有在SELECT子句中添加x.company\u id
时才会出错。+1对我来说也是一个bug。我在Oracle支持中发现了一个相关bug。这与ing,但它表明Oracle在不引发不明确异常方面存在问题:“Bug 5368296-ANSI join SQL可能不会为不明确列报告ORA-918”。尽管存在这些(罕见的)ANSI语法错误,但我认为ANSI语法仍然值得。如果我能避免无组织的(+),我很乐意每年接受一次Oracle错误语法。并不是所有的错误都是相同的。当一个带有ANSI join的错误导致一个关键的查询出现细微的错误,在通知之前在生产环境中运行2周,并导致数据损坏,需要4周的时间来清理…作为一个主张广泛采用更干净语法的人,这不是世界上最好的感觉。。。