2016-12-14 67 views
-1

我有两个表雇员主表和时间表表。如何从其他表中缺少的表中选择记录

员工表结构:

+------------+---------+ 
| emp_number | empname | 
+------------+---------+ 
|   2 | Jagdish | 
|   3 | Sulata | 
|   4 | Prasad | 
|   5 | Vijay | 
|   6 | Armin | 
+------------+---------+ 

和时间表表结构:

+------------+--------+------------+------------+ 
| emp_number | status | startDate | EndDate | 
+------------+--------+------------+------------+ 
|   2 | 0  | 2016-01-01 | 2016-01-07 | 
|   3 | 1  | 2016-02-01 | 2016-02-06 | 
|   4 | 40  | 2016-01-01 | 2016-01-07 | 
|   9 | 0  | 2016-01-06 | 2016-01-12 | 
|   10 | 4  | 2016-01-01 | 2016-01-08 | 
+------------+--------+------------+------------+ 

我们可以编写一个查询来获取使用GROUP BY周所有员工记录?
请引导我。谢谢。

+0

请分享预期输出 – Wanderer

+0

你可以加入使用LEFT JOIN emp_number列两个表。在where子句中,如果您选择emp_number为NULL条件,那么您将缺少行 – Eralper

+0

我删除了所有这些dbms标签。随意添加其中一个回来。 – jarlh

回答

0
SELECT * FROM Employee Table 
WHERE NOT EXISTS(SELECT 1 FROM Timesheet WHERE Employee.emp_number = Timesheet 
.emp_number AND Status IN (0,40)) 
0

下面的代码尝试按您的特定问题

select employee.* 
from employee 
where employee.emp_number not in (select emp_number from timesheet) 
and timesheet.status in (0,40) and timesheet.enddate between '2016-01-01' 
and '2016-01-07' 
0

我相信这是正确的代码:

SELECT * 
FROM Timesheet INNER JOIN Employee ON Timesheet.emp_number=Employee.emp_number 
WHERE (Employee.status = 0 OR Employee.status = 40) 
    AND (Timesheet.startDate = '2016-01-01' AND Timesheet.EndDate = '2016-01-07') 

您可能需要更改分号之间的日期取决于关于startDate和EndDate的数据类型,

例如:'2016-01-01 00:00:00'

+0

没有它没有工作。我认为左连接将起作用而不是内连接。但我没有得到增加额外的状态和日期条件的地方。 – Madhura

0

- 试试这个代码。它的速度更快

WITH cte_timesheet AS (
    select employee_id, 
     MAX(CASE WHEN status IN (0,40) THEN 1 ELSE 0 END) include_status 
    from em_timesheet 
    where start_date = '2016-12-05' 
     AND end_date = '2016-12-11' 
    GROUP BY employee_id 
) 
SELECT emp_number, 
     empname 
    FROM em_employee e 
    LEFT JOIN cte_timesheet t ON t.employee_id = e.emp_number 
    WHERE t.employee_id IS NULL 
    OR t.include_status = 1 
0

试试这个下面code.its很简单

select * from #emp E 
LEFT JOIN #TimeSheet T ON t.emp_nbr=e.emp_nbr 
where startdate>='2016-01-01' and enddate<='2016-01-07' 
and status_ in(0,40) 
相关问题