在这个查询中,我不明白:
什么是p1.Person
和p2.Person
。
SELECT p1.Person AS PERSON, p2.Person AS FRIEND_OF_FRIEND
FROM PersonFriend pfl JOIN Person p1 ON pfl.PersonID = p1.ID
JOIN PersonFriend pf2 ON pf2.PersonID = pf1.FriendID
JOIN Person p2 ON pf2.FriendID = p2.ID
WHERE p1.Person = "Alice" AND pf2.FriendID <> p1.ID
答案1
正如 mcalex 指出的那样,它们是表引用,在这种情况下,它们引用了同一张表两次,因为它与自身相连。该Person
位包含人员的姓名(根据图形)。
查询如下:
SELECT p1.Person AS PERSON, p2.Person AS FRIEND_OF_FRIEND
FROM PersonFriend pf1
JOIN Person p1 ON pf1.PersonID = p1.ID
JOIN PersonFriend pf2 ON pf2.PersonID = pf1.FriendID
JOIN Person p2 ON pf2.FriendID = p2.ID
WHERE p1.Person = "Alice" and pf2.FriendID <> p1.ID
仔细查看条款中对表格的每次提及FROM
。您将能够看到,每次提及表格时,都有一个简写(例如JOIN Person
p1
)。最终会得到以下简写/引用名称:p1
、p2
和。其中和引用表pf1
,并引用。pf2
p1
p2
Person
pf1
pf2
PersonFriend
在正常情况下,您可以使用表的整个名称,如Person
或,PersonFriend
但JOINS
由于此查询中有多个自连接,因此您需要另一种方法来识别您所指的是表的哪个特定实例的哪些字段。
编辑:mcalex 给出的参考(在一个查询中使用同一个表两次) 包含更多有关自连接含义的信息。