4

我正在尝试编写一个涉及两个表的简单查询。"person" 表有一个唯一的person_id和 a name,而 "friends" 表有 aperson_id和 a ,它们是person 表中friend_ida 的 FK 。person_id

person:
<PK> int person_id 
varchar[45] name

friends: 
<PK> int person_id
<PK> int friend_id

我想选择人 1 的所有朋友的名字。

我可以使用以下IN语句轻松做到这一点:

SELECT p.name FROM person p WHERE p.person_id IN (SELECT f.friend_id FROM friends f WHERE f.person_id = 1);

但是,我不擅长写JOIN陈述。有人可以帮我写等效的加入吗?

显然这是一个人为的例子,但我已经尝试使用我的真实数据并且在概念上遗漏了一些东西。谢谢。

4

5 回答 5

7

你想要这样的东西:

SELECT p.name, f.friend_id
FROM person AS p
INNER JOIN friends AS f ON p.person_id = f.person_id
WHERE p.person_id = 1

这将两个表连接在一起使用p.person_id = f.person_id

如果一个人没有朋友,你将不会得到任何行回来 - 如果你不想要这个然后使用 LEFT JOIN 你会得到一个 NULL 行friend_id

编辑:如果您想将朋友重新加入个人:

SELECT p.name AS person_name, friend.name AS friend_name
FROM person AS p                                         -- Our person
INNER JOIN friends AS f ON p.person_id = f.person_id     -- the join table
INNER JOIN person AS friend on f.friend_id = friend.id   -- Join back on person again
WHERE p.person_id = 1

也许您的应用程序需要像这样的 3-way join,但通常您只需要上述的 2-way 连接,或者像这样:

SELECT p.name, f.friend_id
FROM person AS p
INNER JOIN friends AS f ON p.person_id = f.friend_id
WHERE f.person_id = 1

这将为您提供与 person_id 1 成为朋友的所有人的姓名(但不是 person_id 1 的姓名)

于 2008-12-02T18:01:48.043 回答
6
select 
    p.name,
    p2.name as friend_name,
from
    person p 
    inner join friends f on p.person_id = f.person_id
    inner join person p2 on f.friend_id = p2.person_id -- friends
where
    p.person_id = <your criteria>
于 2008-12-02T18:06:27.363 回答
1
SELECT p.name FROM person p 
INNER JOIN friends f ON f.friend_id = p.person_id
WHERE f.person_id = 1;
于 2008-12-02T18:02:07.327 回答
0
选择 p.name
来自人 p,朋友 f
其中 f.friend_id = p.person_id
和 f.person_id = 1
于 2008-12-02T18:07:05.303 回答
0

我很确定托尼·安德鲁斯是对的,除了我认为正确的语法将源表放在左边,连接表放在右边......

SELECT p.name FROM person p 
INNER JOIN friends f ON p.person_id = f.friend_id
WHERE f.person_id = 1

这将返回在字段中找到值且字段等于 1[person.name]的所有记录的字段......当 [1] 的每个朋友被连接在一起并限制为[person.person_id][friends.friend_id][friends.person_id]friends.person_id=[1]

于 2008-12-02T18:13:22.560 回答