【问题标题】:Complex query containing multiple joins is not executing right outer join包含多个连接的复杂查询未执行右外连接
【发布时间】:2019-01-23 07:56:04
【问题描述】:

我正在编写一个包含多个连接的查询,我希望每个用户都针对所有类别类型显示条目。当我执行下面的查询时,仅返回 1 条记录,因为员工 u.employee_id = "0079-P" 仅在 1 个项目上工作,但我想获取所有 category_types 的数据,用户工作时间显示为 null 对于他没有工作的类别.

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 条记录。

【问题讨论】:

标签: mysql sql sql-server database


【解决方案1】:

您可以将查询更改为:

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;

【讨论】:

  • 好的,所以这仅向我显示了 1 个记录行(行中的其余值为空),这意味着它在显示方面工作得很好,但只显示了 1 个记录,我希望它显示所有以这种方式生成 50 份报告
  • 非常感谢。如果您不介意简要解释为什么要这样做,那么对于像我这样的新手来说将非常有帮助。再次感谢您
  • @Saad 作为我回答的原因,You only got 1 row because the condition in WHERE clause filter all the NULL user_id rows for other category.。所以我可以将条件从WHERE 移动到ON 子句(如我的回答),或者在像LEFT JOIN (SELECT * FROM timesheet_mr WHERE tsmr_id = 14) ON... 这样的连接时将嵌套条件移动到表中。并且因为您希望类别是基表,所以它应该是GROUP BY ct.ctd_id,因为tsd.tsd_category_type_id 可能为空而不是类别id 列表。
  • 感谢您解释这一切现在都有意义
猜你喜欢
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2012-11-29
  • 2018-10-14
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2010-11-02
相关资源
最近更新 更多