【问题标题】:Oracle SQL - Checking status based on effective dates for list of employeesOracle SQL - 根据员工列表的生效日期检查状态
【发布时间】:2015-12-16 00:59:38
【问题描述】:

我有 2 个表 - 表 A 包含有效日期的员工列表,另一个表 B 包含员工参考详细信息。

  • 表 A - 1) Emp_ID、2)Effective_Start、3)Effective_End
  • 表 B - 1) Emp_ID, 2)Emp_status

我要做的是根据 Emp_ID 筛选出有效的员工列表 - 有效的定义是 Emp_status 为 A(活动)并且该员工的特定日期(当前日期)属于Effective_start 和 end 日期。

表 A 大约有 800 条记录,表 B 大约有 2000 条记录。我应该如何通过 SQL 查询来做到这一点,这样它才会高效?

我正在考虑从表 B 中过滤掉有效的 EMP_ID 列表(约 500 条记录),然后根据 EMP_ID 和当前日期与表 A 连接,看看它是否在有效期内。但是,这意味着在表 A 的 2000 条记录中每 500 条记录进行比较,并且表 A 预计未来会增长。

对解决这个问题有什么建议吗?

【问题讨论】:

  • 我认为你应该加入这两个表。关于您对表增长的关注,请记住,您将始终必须在其中一个表中执行完整扫描,除非您一次与一名员工一起工作,在这种情况下,我会让员工获得成本最低的表,然后将他从另一个通过它的 PK 收集。

标签: sql oracle plsql


【解决方案1】:

您可以连接这两个表,并在单个表中省略不符合条件的列。 喜欢表 A - 省略当前日期不适合开始日期和结束日期的日期,以及表 B - 省略 Emp_Status 不是 A(活动)的那些

SELECT t1.Emp_ID , t1.Effective_Start, t1.Effective_End,
       t2.Emp_Status
       FROM table1 t1
       JOIN table2 t2 ON t1.Emp_ID = t2.Emp_ID 
       WHERE ( 
             CURDATE( ) BETWEEN t1.Effective_Start AND t1.Effective_End )
             AND t2.Emp_Status = 'A' 
             ); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多