【问题标题】:Specify default value where no matching JOINed record指定没有匹配 JOINed 记录的默认值
【发布时间】:2012-03-12 12:30:27
【问题描述】:

一位同事试图在具有自定义报告功能的 ERP 系统中生成报告;底层数据库是 Oracle 11g。这里的重要事实是 ERP 报告功能可能限制了我们可以为该报告采取的方法。这是我同事的怀疑,但我对此了解的不够多,无法证实这一点。

问题: 我们有一张详细说明公司内部职位的表格,我们称之为Roles,还有一张表格存储在给定时间窗口内分配给每个角色的人员,我们称之为PersonRoles

对于给定的日期,我们希望返回一个或多个具有特定角色的人(可能有多个人同时担任相同的角色)。

但是,有时角色会空缺一段时间;例如,如果 PersonA 从 1 月到 5 月担任角色,而 PersonB 从 8 月到 12 月担任角色,则将有 2 个月的窗口,其中没有人在帖子中。在这种情况下,当我们查询某一天(六月/七月)时,我们希望返回一个标准结果(比如“空缺”)。

我不仅有兴趣了解“最佳”方法,而且其他方法可能更适合此报告工具的假设限制,因此它们也将受到欢迎。

【问题讨论】:

  • 我忘记了这个 Qn - 我将这个建议传递给了我的同事,然后忘记了。我不再在那里工作(他也不再在那里工作)所以我不知道最终的解决方案是什么;所以我选择了两个答案中最“完整”的一个。

标签: sql oracle join reporting


【解决方案1】:

在不了解报告工具的局限性的情况下,显然很难回答这个问题。不过,最简单的方法是进行外部连接。类似于

SELECT r.role_name,
       nvl( pr.person_name, 'Vacant' )
  FROM roles r
       LEFT OUTER JOIN personRoles pr  
         ON(    r.role_id = pr.rold_id
            AND <<some date parameter>> BETWEEN pr.start_date AND pr.end_date)

【讨论】:

  • 我理解缺乏对报告工具的了解是一个障碍,我什至无法说出感知到的限制是真实的还是想象的。因此,为什么欢迎一系列解决方案。
【解决方案2】:

RolesPersonRoles 表的左外连接角色ID日期期间。包括 coalesce(PersonRoles.PersonIdentifier,'Vacant') 项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2017-12-05
    相关资源
    最近更新 更多