Я пытаюсь написать простой запрос, включающий две таблицы. Таблица «person» имеет уникальные person_id и name, а таблица «friends» имеет person_id и friend_id, которые являются FK для person_id в таблице person.
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. Может ли кто-нибудь помочь мне написать эквивалентное соединение?
Ясно, что это надуманный пример, но я пробовал использовать свои реальные данные и концептуально что-то упустил. Спасибо.


Вам нужно что-то вроде этого:
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
Возможно, вам понадобится трехстороннее соединение, подобное этому, для вашего приложения, но обычно вам понадобится только двухстороннее соединение, как указано выше, или подобное:
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)
SELECT p.name FROM person p
INNER JOIN friends f ON f.friend_id = p.person_id
WHERE f.person_id = 1;
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>
select p.name from person p, friends f where f.friend_id = p.person_id and f.person_id = 1
Я почти уверен, что Тони Эндрюс понял это правильно, за исключением того, что я думаю, что правильный синтаксис помещает исходную таблицу слева, а объединенную таблицу справа ...
SELECT p.name FROM person p
INNER JOIN friends f ON p.person_id = f.friend_id
WHERE f.person_id = 1
Это вернет поле [person.name] всех записей, где значение [person.person_id] находится в поле [friends.friend_id], И поля [friends.person_id] равны 1 .... каждый, кто является другом [1], будет существовать в таблице отфильтрованных лиц, когда они присоединятся вместе и ограничены friends.person_id=[1]