2013-03-04 54 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