Я привык к простым запросам SQL и не могу получить этот. У меня есть таблица участников, которая настроена так:
member_id | member_number | member_fname | member_name | member_parent_id | member_status
member_parent_id — это ссылка наmember_id
На данный момент я получил результаты, но не могу понять, как добавить дополнительный столбец для родительского элементаmember_number.
SELECT members.member_id, member_id_parent, member_nbr, member_fname, member_name, member_note
FROM members
LEFT JOIN .... other table
LEFT JOIN .... other table
WHERE member_id_parent IS NOT NULL
AND member_status = 1
;
Я попробовал несколько примеров с WITH RECURSIVE
, но смог понять логику и внести необходимые исправления, чтобы все заработало.
Спасибо,
В таблице естьmember_parent_id, но в вашем запросе естьmember_id_parent, есть ли где-то опечатка?
Да P.Salmon, это опечатка. должно быть member_parent_id
Спасибо за кеширование.
помогают ли ответы решить вашу проблему @MarcDG?
@DerekRoberts Оба решения работают, но я предпочитаю первое, потому что оно больше похоже на то, к чему я привык. Поскольку это просто извлечение данных для миграции, я не ищу что-то производительное, если другое будет. Большое спасибо за ваше!
Используйте псевдонимы имен для таблицы. Здесь я использую m
для члена и p
для родителя:
SELECT m.member_id, m.member_id_parent, m.member_nbr,
m.member_fname, m.member_name, m.member_note,
p.member_fname as parent_fname,
p.member_name as parent_name,
p.member_note as parent_note
FROM members m
LEFT JOIN members p ON p.member_id = m.member_id_parent
LEFT JOIN .... other table
LEFT JOIN .... other table
WHERE m.member_id_parent IS NOT NULL
AND m.member_status = 1
;
Ага! Это работает.
Вот шаги, которые вы можете использовать для решения этой проблемы.
Вы можете создать CTE
, чтобы получить каждыйmember_id иmember_number для всех участников в вашей таблице.
Следующий шаг — использовать созданный CTE
для join
с запросом, используемым для получения parent_member_number
.
Вот быстрая демонстрация fiddble
WITH ParentMembers AS (
SELECT
member_id,
member_number AS parent_member_number
FROM
members
)
SELECT
m.member_id,
m.member_parent_id,
m.member_number,
m.member_fname,
m.member_name,
p.parent_member_number -- another other parent member_number
FROM
members m
LEFT JOIN
ParentMembers p ON m.member_parent_id = p.member_id
WHERE
m.member_parent_id IS NOT NULL
AND m.member_status = 1;
Спасибо за скрипку! Этот тоже работает!
Мне любопытно понять. Итак, оператор With создает временную таблицу, которую вы можете использовать с помощью простого JOIN? Я сохраню это в своей библиотеке. Я вижу несколько хороших применений.
Пожалуйста, прочитайте минимальный воспроизводимый пример , а затем отредактируйте свой вопрос, указав данные примера и желаемые результаты в соответствии с Почему я должен предоставлять минимальный воспроизводимый пример для очень простого SQL-запроса?