2013-11-27 25 views
3

有人知道爲什麼它可以同時使用表別名「x」嗎?Oracle SQL非唯一表別名一個選擇

Select x.company_name 
     ,x.employee_name 
FROM company x 
JOIN employee x ON x.company_id = 5 

我知道,ID爲5是沒有意義的加入...

謝謝你的課!

+0

是'company_id'唯一列? – Armunin

+0

感謝您的快速回答。在我看來,這並不重要。我想知道爲什麼我可以兩次使用相同的別名「x」。 可以說,在公司它是獨一無二的,而不是員工。關係是「公司有很多員工」。 – dantastic

+0

我的觀點是,如果列名('company_name','employee_name'和'company_id')是唯一的,所以它們只存在於兩個表中的一箇中,別名並不重要。 – Armunin

回答

2

下面的前兩個查詢是等價的。在連接的ON子句中,表別名x僅引用最後一個表以使用該別名,因此只有employee表受到限制。

SELECTWHERE表達式x別名是指兩個表 - 所以,這裏的列名是唯一的,然後他們可以成功地引用,但是那裏有相同的列名的時候,甲骨文提出了一個ORA-00918: column ambiguously defined異常(如查詢碰巧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 | 
2

我會在「Oracle bug」上撒錢 - 在採用ANSI JOIN語法的所有事情中,我最擔心的是Oracle的這種令人痛苦的令人生畏的錯誤執行方式。這就是說,「沒有發現語法錯誤」是非常小的,據我所知,Oracle已經在很大程度上清理了他們的行爲。

+0

+1對我來說也是一個bug。我在My Oracle Support上發現了一個相關的錯誤。這不是同一回事,但它表明Oracle沒有引發模糊異常:「錯誤5368296 - ANSI連接SQL可能不會將ORA-918報告爲模糊列」。儘管即使有這些(罕見的)ANSI語法錯誤,我認爲ANSI語法仍然非常值得。如果我能避免無組織的(+)語法,我會很樂意每年接受一次Oracle錯誤。 –

+0

並非所有的錯誤都是平等的。當一個ANSI加入的bug導致一個關鍵的查詢得到微妙錯誤的結果時,在通知之前的兩週內在生產中運行,並導致數據損壞需要4周的時間來清理......並非世界上最好的感覺是在那裏爭論廣泛採用清潔語法的人...... – KevinKirkpatrick

相關問題