2013-03-04 60 views
0

我想了解SQL自連接。我有以下表「人」具有名字,姓氏,地址和僱員的城市(來源W3Schools的):瞭解SQL自加入

mysql> select * from persons; 
+------+-----------+-----------+--------------+-----------+ 
| P_id | LastName | FirstName | Address  | City  | 
+------+-----------+-----------+--------------+-----------+ 
| 1 | Hansen | Ola  | Timoteivn 10 | Sandnes | 
| 2 | Svendson | Tove  | Borgvn 23 | Sandnes | 
| 3 | Pettersen | Kari  | Storgt 20 | Stavanger | 
+------+-----------+-----------+--------------+-----------+ 

我現在想返回具有相同的城市作爲的僱員的姓名「漢森奧拉'。所以我寫了一個自連接,它工作正常:

mysql> select p1.Lastname, p1.firstname from persons p1, persons p2 where p1.city = p2.city and p2.lastname = 'Hansen'; 
+----------+-----------+ 
| Lastname | firstname | 
+----------+-----------+ 
| Hansen | Ola  | 
| Svendson | Tove  | 
+----------+-----------+ 

但是,如果我別名P2變更爲P1即p2.lastname =「漢森」到p1.lastname =「漢森」,然後我不t取得兩名僱員的姓名。

mysql> select p1.Lastname, p1.firstname from persons p1, persons p2 where p1.city = p2.city and p1.lastname = 'Hansen'; 
+----------+-----------+ 
| Lastname | firstname | 
+----------+-----------+ 
| Hansen | Ola  | 
| Hansen | Ola  | 
+----------+-----------+ 

有人請幫我理解爲什麼改變別名從p2到p1會改變結果嗎?謝謝。

回答

1

讓我強調你的查詢,並希望它會更有意義:

select p1.lastname, ... 
from persons p1, persons p2 
where ... and p1.lastname = 'Hansen' 

所以你限制的結果只從第一個表返回記錄,P1。同時你將第一個表限制爲只有lastname ='Hansen'的表。如果你的無限制的結果集,它可能更有意義(我刪除了WHERE條款的abiguous部分充分展現產品):

select p1.Lastname as p1_lastname, p2.lastname as p2_lastname 
from persons p1, persons p2 
where p1.city = p2.city 

P1_LASTNAME  P2_LASTNAME 
Hansen Hansen 
Svendson Hansen 
Hansen Svendson 
Svendson Svendson 
Pettersen Pettersen 

如果你把上面的結果集,並添加條件p1.lastname = "Hansen",這是毫不奇怪,你只能得到'漢森'。

+0

謝謝。我現在明白了。 – 2013-03-04 06:16:20

0

您的查詢僅返回那些包含'Hansen'的行。它不是跟隨自我加入。

1

查詢有點奇怪,我不確定它在現實中有什麼基礎。從本質上說,它將城市列匹配的表與自身相連,然後指定其中一個表的lastname,這限制了結果。如果執行SELECT *而不是僅選擇有限的行,則可以看到該表正在與其自身交叉連接,並且它返回按citylastname要求過濾的行的叉積。實際結果如下:

p1.firstname, p1.lastname, p2.firstname, p2.lastname 
Hansen  Ola   Hansen  Ola 
Hansen  Ola   Svendson  Toda 

由於條件反轉,原來的查詢被顛倒過來。

+0

感謝您的解釋。 – 2013-03-04 06:16:41