2017-04-19 57 views
0

我正在學習使用SQL進行編程,並擔心爲什麼以下自連接的行爲方式如此。關於自連接的關注

我加入到自己的表是僱員表: EMPLOYEES

我試圖符合每個員工的姓氏和EMPLOYEE_ID各自的經理人的姓氏和僱員標識。

以下兩個查詢完成這個任務,但顯着不同的輸出:

select w.last_name, w.employee_id, m.last_name as manager, m.employee_id as manager_id 
from employees w join employees m 
on (w.manager_id = m.employee_id); 

返回:

Result 1

select w.last_name, w.employee_id, m.last_name as manager, m.employee_id as manager_id 
from employees w join employees m 
on (w.employee_id = m.manager_id); 

返回:

Result 2

從我的理解,這兩個查詢應具有相同的結果,因爲(w.manager_id = m.employee_id)在邏輯上等同於(w.employee_id = m.manager_id)

那麼,爲什麼結果如此截然不同?

+1

我希望沒有真正的電話號碼... –

+0

請閱讀http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so - 當提問/ 285557和接受的答案 –

回答

1

「這兩個查詢應具有相同的結果,因爲(w.manager_id = m.employee_id)是邏輯上等同於(w.employee_id = m.manager_id)」

在一定程度上。由manager_id引用的邏輯表是管理的集合;由employee_id引用的邏輯表是的管理者集合

在您的第一個查詢邏輯表M是管理器的集合,在第二個查詢中它是託管的集合。除了在翻轉連接時沒有翻轉列別名,這並不重要。所以m.employee_id as manager_id在第一個查詢中是正確的,但在第二個查詢中是錯誤的。這是與數據不同的標籤。

這將更清楚你已經排序的結果集。將order by m.employee_id, w.manager_id添加到第一個查詢中,將order by w.employee_id, m.manager_id添加到第二個查詢中,並且您會發現協調兩個輸出會更加容易。

0

經過一番風格後,兩個查詢返回相同的結果。他們從相反的方向看待同樣的關係。

在一種情況下,經理出現在最左側的列中,而另一個最右側的列中出現。相同的對,不同的表示。