Вопрос или проблема
Я хочу написать запрос, который возвращает имена и имена их лучших друзей из таблицы ниже:
Пример таблицы FRIEND:
FriendID | Имя | ЛучшийДругID |
---|---|---|
1 | Эбби | |
2 | Боб | 3 |
3 | Карл | 2 |
Ожидаемый результат:
Имя | Лучший друг |
---|---|
Эбби | |
Боб | Карл |
Карл | Боб |
Мой код на данный момент:
SELECT A.Name, B.BestFriendID AS Bestfriend
FROM FRIEND A, FRIEND B
WHERE A.FriendID = B.BestFriendID;
Проблема в том, что результат возвращает ID оригинального друга:
Имя | Лучший друг |
---|---|
Эбби | 1 |
Боб | 2 |
Карл | 3 |
Так что я упустил? Буду благодарен за любую помощь.
Вы близки! Вам нужно объединить таблицы по ЛучшийДругID
, а затем выбрать имя друга, вы забыли об этом – попробуйте так:
SELECT A.Name, B.Name AS Bestfriend
FROM FRIEND A
LEFT JOIN FRIEND B ON A.BestFriendID = B.FriendID;
Ответ или решение
Конечно! Давайте разберёмся с вашей задачей.
У вас есть таблица "FRIEND", которая содержит информацию о друзьях, а именно их ID, имена и ID лучших друзей. Вы хотите написать запрос, который вернёт имена друзей и их лучших друзей.
Ваш текущий код использует старый стиль соединения таблиц, что приводит к ошибочному выводу. Вам нужно использовать JOIN
, чтобы корректно связать таблицу с самой собой на основе идентификатора лучшего друга. Ваша цель состоит в том, чтобы получить имя друга и имя его лучшего друга.
Вот корректный SQL-запрос:
SELECT A.Name, B.Name AS Bestfriend
FROM FRIEND A
LEFT JOIN FRIEND B ON A.BestFriendID = B.FriendID;
Объяснение запроса:
-
SELECT: Мы выбираем два поля:
A.Name
(имя друга) иB.Name
(имя лучшего друга). Для этого мы используем псевдонимыA
иB
, чтобы отличить два экземпляра одной и той же таблицы. -
FROM FRIEND A: Здесь мы обозначаем первый экземпляр таблицы "FRIEND" как
A
. -
LEFT JOIN FRIEND B: Мы используем левое соединение (
LEFT JOIN
), чтобы получить все записи из таблицыA
даже в том случае, если у некоторых друзей нет лучшего друга. -
ON A.BestFriendID = B.FriendID: Этот критерий соединения говорит SQL, что мы соединяем
BestFriendID
из таблицыA
сFriendID
во втором экземпляреB
.
Пояснения к ожидаемому результату:
- Данные о друге с
FriendID
1 (Абби) не имеют лучшего друга, поэтому в соответствующей ячейке будет значение NULL. - Друзья с
FriendID
2 (Боб) иFriendID
3 (Карл) имеют друг друга в качестве лучших друзей, поэтому в их соответствующих ячейках будут их имена.
Таким образом, запрос выдаст ожидаемый вывод:
Name | Bestfriend |
---|---|
Abby | |
Bob | Carl |
Carl | Bob |
Это должно решить вашу задачу. Если у вас есть дополнительные вопросы, не стесняйтесь задавать их!