【问题标题】:4-table query with one LEFT JOIN一个 LEFT JOIN 的 4 表查询
【发布时间】:2019-09-23 23:08:35
【问题描述】:

我正在开发一个可以帮助我平衡加班的应用程序。我需要检索在给定时间段 (OT_Shift.OT_PeriodID=4) 内满足特定条件 (Staff.OT_Eligibility=1) 的所有员工的列表,以及在该期间提供的轮班总数.以下查询提取了正确的结果,但不包括提供总轮班次数为 0 的任何员工。

我遇到的问题是我需要在查询中返回的列由两个中间表分隔。对于 OT 的每个班次,有多个符合条件的工作人员,每个有资格参加该班次的工作人员可能有 7 个不同的响应代码之一(每个响应代码分配了不同的值来计算均衡)。这会强制从 Staff->OT_Shift->OT_Shift_Roster->OT_Response 建立关系。

我尝试在每个 JOIN 语句中包含“LEFT JOIN”,希望它可能只是以相反的顺序评估并且不会改变结果集。

SELECT 
    s.Staff_ID,
    s.LastName,
    sum(ResponseValue) AS Shift_Count
FROM Staff s
LEFT JOIN OT_Shift_Roster sr
    ON s.Staff_ID=sr.RosterID
JOIN OT_Response otr
    ON sr.Response=otr.OT_Response_ID
JOIN OT_Shift ots
    ON sr.ShiftID=ots.Shift_ID
WHERE
    s.OT_Eligibility = 1 AND ots.OT_PeriodID=4
GROUP BY s.Staff_ID

我得到了以下信息,但我还缺少大约 20 名在“Shift_Count”字段中有 0 的员工。

# Staff_ID, LastName, Shift_Count
3, Kantner, 1
10, Wells, 2
12, Moore, 1
46, Denomy, 1
48, Costanzo, 1
49, George, 2
50, Schusterman, 2
51, O'Connor, 1
55, McLeod, 2
59, Potter, 1
69, Tristan, 1
75, Gardull, 1
77, Weis, 1
106, Thomasson, 1
107, Lehmann, 1

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您需要将依赖于LEFT JOINed 表的所有JOINs 转换为LEFT JOINse 到JOINON 子句。当LEFT JOIN 中没有记录匹配时,COALESCE()(或 RDBMS 上的类似名称)可用于返回 0 而不是 NULL

    SELECT 
        s.Staff_ID,
        s.LastName,
        COALESCE(SUM(ResponseValue), 0) AS Shift_Count
    FROM Staff s
    LEFT JOIN OT_Shift_Roster sr
        ON s.Staff_ID=sr.RosterID
    LEFT JOIN OT_Response otr
        ON sr.Response=otr.OT_Response_ID
    LEFT JOIN OT_Shift ots
        ON sr.ShiftID=ots.Shift_ID AND ots.OT_PeriodID=4
    WHERE
        s.OT_Eligibility = 1 
    GROUP BY s.Staff_ID
    

    基本原理:WHERE 子句中的条件必须满足每条记录。但是当LEFT JOIN 为空时,条件不能满足,违规记录将从结果集中逐出。换句话说,在WHERE 子句中对LEFT JOINed 表设置条件会隐式地将其转换为INNER JOIN。相同的逻辑适用于依赖于 LEFT JOINed 表的 INNER JOIN

    【讨论】:

    • 看准了!谢谢你。感谢您提供解释,让我知道它为什么起作用。
    • 欢迎@Druck281!
    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 2012-03-15
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    相关资源
    最近更新 更多