Написание SQL-запросов - PullRequest
4 голосов
/ 02 декабря 2008

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

Ясно, что это надуманный пример, но я попробовал свои реальные данные и концептуально что-то упустил. Благодаря.

Ответы [ 5 ]

7 голосов
/ 02 декабря 2008

Вы хотите что-то вроде этого:

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)

6 голосов
/ 02 декабря 2008
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>
1 голос
/ 02 декабря 2008
SELECT p.name FROM person p 
INNER JOIN friends f ON f.friend_id = p.person_id
WHERE f.person_id = 1;
0 голосов
/ 02 декабря 2008

Я почти уверен, что Тони Эндрюс понял все правильно, за исключением того, что я думаю, что правильный синтаксис помещает исходную таблицу слева и объединенную таблицу справа ...

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]

0 голосов
/ 02 декабря 2008
select p.name
from person p, friends f
where f.friend_id = p.person_id
and f.person_id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...