Избегание дубликатов при присоединении таблицы к себе - PullRequest
0 голосов
/ 04 мая 2020

Я уверен, что ответ уже есть, но я изо всех сил пытаюсь применить достаточно похожие посты к моей конкретной проблеме c. Пожалуйста, потерпите меня.

У меня есть таблица заданий, которая ссылается на себя с помощью поля id_parent_job. Дочерние вакансии имеют несколько вакансий.

id  id_parent_job  is_active  num_openings
1   1              y          NULL
2   1              n          15
3   1              y          10
4   4              y          NULL
5   4              n          13
6   6              y          NULL
7   6              y          15
8   6              n          15
9   6              y          15

Учитывая идентификатор родительской работы, я хочу найти 2 цифры: сумму вакансий и сумму активных вакансий. Вот желаемые результаты. Мне нужна помощь с запросом.

job 1: 25 openings, 10 active openings
job 4: 13 openings, 0 active openings
job 6: 45 openings, 30 active openings

Ниже приведен запрос, с которым я работаю, но он приводит к дублированию. Это является (может быть?) Хорошим объяснением проблемы.

SELECT jobs.id, SUM(childjobs.num_openings), SUM(activechildjobs.num_openings) FROM jobs
    LEFT JOIN jobs AS childjobs
        ON childjobs.id_parent_job = jobs.id
        AND childjobs.id != jobs.id
    LEFT JOIN jobs AS activechildjobs
        ON activechildjobs.id_parent_job = jobs.id
        AND activechildjobs.id != jobs.id
        AND activechildjobs.is_active = 'y'
    WHERE jobs.id = 1

Вот неверные результаты.

job 1: 25 openings, 20 active openings
job 4: 13 openings, 0 active openings
job 6: 90 openings, 90 active openings

Работы с более чем одним ребенком считая детей несколько раз.

1 Ответ

1 голос
/ 04 мая 2020

Вы можете использовать условное агрегирование и группирование по id_parent_job, чтобы избежать JOIN s, которые вызывают дублирование записей (и, следовательно, неверное число):

SELECT id_parent_job AS id, 
       SUM(num_openings) AS openings,
       SUM(CASE WHEN is_active = 'y' THEN num_openings ELSE 0 END) AS active_openings
FROM jobs
GROUP BY id_parent_job

Вывод:

id  openings    active_openings
1   25          10
4   13          0
6   45          30

Демонстрация на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...