我试图使用连接编写SQL Server查询并遇到一些困难

时间:2017-08-10 03:26:38

标签: sql sql-server sql-server-2008

表格详细解释如下:

我有3张桌子:

表A
它作为有关员工信息的主表。

  • EmployeeId(主键)
  • 员工指定
  • EmployeeName(与此特定查询无关的更多员工数据列)

表B
它用作存储所有员工的表。对于已经报告生病或正在休假或有怀孕假的员工,以及不可用的员工的底线

  • EmployeeID(主键)(也将主表A引用为外键)
  • AccountedFor
  • AccountedFordurationFrom(datetime)
  • AccountedForDurationTo(datetime)

表C:
它作为一个表格,其中存在员工的原始数据。例如,我们将组织的时间表作为事件传播,第一个事件是早晨时间会议,第二个是静音工作时间,第三个是头脑风暴会议等。现在,如果员工因特定事件而被免除,则会在此处输入。

  • 雇员
  • EVENTCODE
  • Excuse_DurationFrom
  • 借口持续时间
  • 任何具体细节

此处EmployeeIDExcusedForEventCode都是复合主键,因为多个借口可能会有相同的employeeId,但组合始终是唯一的。

我们已经建立了一些自定义考勤管理系统,需要以下详细信息:

  1. 我们需要找到所有那些既没有考虑也没有为特定事件辩解的员工(这将通过前端提供)持续一段时间从前端选择。

  2. 上述查询的结果随后将用于与生物识别考勤机日志进行比较 EmployeeId|LogDate(datetime)|EventCodes作为我们数据库的单独表输入(主表一个employeeId将此EmployeeId作为外键引用)

  3. 将比较它以找出特定事件的真正缺席者。即所有那些既没有考虑也没有任何特定事件的借口以及在生物识别扫描机日志中没有弄清楚的员工在所选择的持续时间内都没有。我们需要像EmployeeId|Employee Designation|Employee Name|EventName (have a separate table linking with EventCode)|Date&time这样的缺席者输出(这将是每个每个活动报告的员工在选定的持续时间内缺席)。

    我们尝试了类似的查询:

    select 
        employeemastertable.employeeid, 
        employeemastertable.Designation,
        employeemastertable.Name,
        EventCodes.EventCodeName as Eventexcusedfrom 
    from 
        employeemastertable 
    inner join 
        employeeexcusedforevents on employeemastertable.employeeid = employeeexcusedforevents.employeeid 
    inner join 
        EventCodes on employeeexcusedforEvents.ExcusedForEventCode = EventCodes.Eventcode 
    left join 
        employeeaccountedFor on employeemastertable.employeeid = employeeaccountedFor.employeeid 
    where 
        employeeexcusedforevents.ExcusedForEventCode != 1 (Morning conference) 
        and employeeaccountedFor.employeeid is null;
    

    名称已更改

    我明白这会给那些在早上会议中没有弄清楚的员工,但是即使我离开了join而不是在employeemastertable和employeeexcusedForevents之间的内部联接,并且把employeeexcusedforevents.excusedforeventcode为null而且employeeexcusedforevents.employeeid为null,I确保所有那些不在另外两个表中的员工,但不满足事件的标准。这意味着如果员工在第二次活动以及组织中被免责。我将如何满足上述代码中的要求? (PS这只是我理解的等式的第一部分,在此之后我还需要其他部分的帮助,其中持续时间和与日志相比)?

1 个答案:

答案 0 :(得分:0)

我假设表EventCodes中的EventCode = 1只有一行。下面我将想要的事件交叉加入员工主表,然后排除任何原谅或解释的员工。

-- employees neither accounted for nor excused for a specific event
SELECT
      em.employeeid
    , em.Designation
    , em.Name
    , ec.EventCodeName AS Eventexcusedfrom
FROM employeemastertable em
CROSS JOIN (
      SELECT Eventcode, EventCodeName
      FROM EventCodes
      WHERE Eventcode = 1
      ) ec
WHERE NOT EXISTS (
      SELECT NULL
      FROM employeeexcusedforevents ee
      WHERE em.employeeid = ee.employeeid
      AND ec.Eventcode = ee.ExcusedForEventCode
      )
AND NOT EXISTS (
      SELECT NULL
      FROM employeeaccountedFor eaf
      WHERE em.employeeid = eaf.employeeid
      )
;