Сложный запрос, содержащий несколько соединений, не выполняет правое внешнее соединение - PullRequest
0 голосов
/ 23 января 2019

Я пишу запрос с несколькими объединениями, в котором я хочу, чтобы каждый пользователь отображал записи для всех типов категорий. Когда я выполняю запрос ниже, возвращается только 1 запись, потому что сотрудник u.employee_id = "0079-P" работал только над 1 проектом, но я хочу получить данные для всех category_types с рабочими часами пользователей, отображаемыми как ноль для категорий, с которыми он не работал ,

Select u.employee_id As Employee_ID, u.user_name As UserName, COALESCE(primaryDept.ctd_name, primaryProj.ctd_name) As PrimaryDeptOrProj, region.region_name As Region, categoryType.ctd_id, categoryType.ctd_name, SUM(tsdd.workhours) 
    From users u 
    LEFT JOIN category_type_details primaryDept ON u.user_primary_department = primaryDept.ctd_id
    LEFT JOIN category_type_details primaryProj ON u.user_primary_project = primaryProj.ctd_id
    LEFT JOIN regions region ON u.region_id = region.region_id
    LEFT JOIN timesheets ts ON u.user_id = ts.timesheet_user
    INNER JOIN timesheet_mr tsmr ON ts.timesheet_caller = tsmr.tsmr_id
    INNER JOIN timesheet_details tsd ON ts.timesheet_id = tsd.tsd_timesheet_id
    INNER JOIN timesheet_day_details tsdd ON tsd.tsd_id = tsdd.tsd_id
    RIGHT OUTER JOIN category_type_details categoryType ON tsd.tsd_category_type_id = categoryType.ctd_id
    WHERE tsmr.tsmr_id = 14 and u.employee_id = "0079-P"
    GROUP BY u.user_id, tsd.tsd_category_type_id;

Я пробовал этот запрос с вариантами, и он возвращает 1 запись в любом случае.

1 Ответ

0 голосов
/ 23 января 2019

Вы можете изменить свой запрос следующим образом:

SELECT u.employee_id AS Employee_ID, u.user_name AS UserName, 
    COALESCE(pd.ctd_name, pp.ctd_name) AS PrimaryDeptOrProj, 
    r.region_name AS Region, ct.ctd_id, ct.ctd_name, SUM(tsdd.workhours) 
FROM users u 
LEFT JOIN category_type_details pd ON u.user_primary_department = pd.ctd_id
LEFT JOIN category_type_details pp ON u.user_primary_project = pp.ctd_id
LEFT JOIN regions r ON u.region_id = r.region_id
LEFT JOIN timesheets ts ON u.user_id = ts.timesheet_user
INNER JOIN timesheet_mr tsmr ON ts.timesheet_caller = tsmr.tsmr_id AND tsmr.tsmr_id = 14
INNER JOIN timesheet_details tsd ON ts.timesheet_id = tsd.tsd_timesheet_id
INNER JOIN timesheet_day_details tsdd ON tsd.tsd_id = tsdd.tsd_id
RIGHT OUTER JOIN category_type_details ct ON tsd.tsd_category_type_id = ct.ctd_id AND u.employee_id = "0079-P"
GROUP BY ct.ctd_id, u.user_id, u.employee_id, u.user_name, 
    COALESCE(pd.ctd_name, pp.ctd_name), r.region_name, ct.ctd_name
ORDER BY ct.ctd_id, u.user_id, u.employee_id, u.user_name, 
    COALESCE(pd.ctd_name, pp.ctd_name), r.region_name, ct.ctd_name;

Вы получили только 1 строку, поскольку условие в предложении WHERE фильтрует все строки NULL user_id для другой категории.

Для MySQL вы можете опустить другие столбцы в предложении GROUP BY:

SELECT u.employee_id AS Employee_ID, u.user_name AS UserName, 
    COALESCE(pd.ctd_name, pp.ctd_name) AS PrimaryDeptOrProj, 
    r.region_name AS Region, ct.ctd_id, ct.ctd_name, SUM(tsdd.workhours) 
FROM users u 
LEFT JOIN category_type_details pd ON u.user_primary_department = pd.ctd_id
LEFT JOIN category_type_details pp ON u.user_primary_project = pp.ctd_id
LEFT JOIN regions r ON u.region_id = r.region_id
LEFT JOIN timesheets ts ON u.user_id = ts.timesheet_user
INNER JOIN timesheet_mr tsmr ON ts.timesheet_caller = tsmr.tsmr_id AND tsmr.tsmr_id = 14
INNER JOIN timesheet_details tsd ON ts.timesheet_id = tsd.tsd_timesheet_id
INNER JOIN timesheet_day_details tsdd ON tsd.tsd_id = tsdd.tsd_id
RIGHT OUTER JOIN category_type_details ct ON tsd.tsd_category_type_id = ct.ctd_id AND u.employee_id = "0079-P"
GROUP BY ct.ctd_id, u.user_id
ORDER BY ct.ctd_id, u.user_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...