有人知道爲什麼它可以同時使用表別名「x」嗎?Oracle SQL非唯一表別名一個選擇
Select x.company_name
,x.employee_name
FROM company x
JOIN employee x ON x.company_id = 5
我知道,ID爲5是沒有意義的加入...
謝謝你的課!
有人知道爲什麼它可以同時使用表別名「x」嗎?Oracle SQL非唯一表別名一個選擇
Select x.company_name
,x.employee_name
FROM company x
JOIN employee x ON x.company_id = 5
我知道,ID爲5是沒有意義的加入...
謝謝你的課!
下面的前兩個查詢是等價的。在連接的ON
子句中,表別名x
僅引用最後一個表以使用該別名,因此只有employee
表受到限制。
在SELECT
和WHERE
表達式x
別名是指兩個表 - 所以,這裏的列名是唯一的,然後他們可以成功地引用,但是那裏有相同的列名的時候,甲骨文提出了一個ORA-00918: column ambiguously defined
異常(如查詢碰巧3如果評論被刪除)。
我在這找不到任何文檔,但它看起來很像一個錯誤。
的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
| 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
| 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
| COMPANY_NAME | EMPLOYEE_NAME |
|--------------|---------------|
| Four Company | Five Emp |
| Five Company | Five Emp |
| Six Company | Five Emp |
我會在「Oracle bug」上撒錢 - 在採用ANSI JOIN語法的所有事情中,我最擔心的是Oracle的這種令人痛苦的令人生畏的錯誤執行方式。這就是說,「沒有發現語法錯誤」是非常小的,據我所知,Oracle已經在很大程度上清理了他們的行爲。
+1對我來說也是一個bug。我在My Oracle Support上發現了一個相關的錯誤。這不是同一回事,但它表明Oracle沒有引發模糊異常:「錯誤5368296 - ANSI連接SQL可能不會將ORA-918報告爲模糊列」。儘管即使有這些(罕見的)ANSI語法錯誤,我認爲ANSI語法仍然非常值得。如果我能避免無組織的(+)語法,我會很樂意每年接受一次Oracle錯誤。 –
並非所有的錯誤都是平等的。當一個ANSI加入的bug導致一個關鍵的查詢得到微妙錯誤的結果時,在通知之前的兩週內在生產中運行,並導致數據損壞需要4周的時間來清理......並非世界上最好的感覺是在那裏爭論廣泛採用清潔語法的人...... – KevinKirkpatrick
是'company_id'唯一列? – Armunin
感謝您的快速回答。在我看來,這並不重要。我想知道爲什麼我可以兩次使用相同的別名「x」。 可以說,在公司它是獨一無二的,而不是員工。關係是「公司有很多員工」。 – dantastic
我的觀點是,如果列名('company_name','employee_name'和'company_id')是唯一的,所以它們只存在於兩個表中的一箇中,別名並不重要。 – Armunin