SQL-запрос внутри той же таблицы

Я привык к простым запросам SQL и не могу получить этот. У меня есть таблица участников, которая настроена так:

member_id | member_number | member_fname | member_name | member_parent_id | member_status

member_parent_id — это ссылка наmember_id

  • Мне нужно получить всех участников, у которыхmember_parent_id не равен нулю.
  • Получите номерmember_number в качестве дополнительного столбца для родительского элемента для каждого участника.

На данный момент я получил результаты, но не могу понять, как добавить дополнительный столбец для родительского элемента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 04.09.2024 09:04

Да P.Salmon, это опечатка. должно быть member_parent_id Спасибо за кеширование.

Marc DG 04.09.2024 15:08

помогают ли ответы решить вашу проблему @MarcDG?

Derek Roberts 04.09.2024 15:12

@DerekRoberts Оба решения работают, но я предпочитаю первое, потому что оно больше похоже на то, к чему я привык. Поскольку это просто извлечение данных для миграции, я не ищу что-то производительное, если другое будет. Большое спасибо за ваше!

Marc DG 05.09.2024 02:07
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте псевдонимы имен для таблицы. Здесь я использую 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
;

Ага! Это работает.

Marc DG 05.09.2024 02:09

Вот шаги, которые вы можете использовать для решения этой проблемы.

  1. Вы можете создать CTE, чтобы получить каждыйmember_id иmember_number для всех участников в вашей таблице.

  2. Следующий шаг — использовать созданный 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;

Спасибо за скрипку! Этот тоже работает!

Marc DG 05.09.2024 02:09

Мне любопытно понять. Итак, оператор With создает временную таблицу, которую вы можете использовать с помощью простого JOIN? Я сохраню это в своей библиотеке. Я вижу несколько хороших применений.

Marc DG 05.09.2024 02:19

Другие вопросы по теме