2016-11-01 8 views
0

Мне нужно сообщить, когда сотрудник не имеет времени, введенного в карточку времени, хранящуюся в таблице, называемой employee_time et.Найти записи на основе идентификатора, который не существует/не существует

Моя проблема заключается в том, чтобы найти людей, которые не указали время на указанную неделю.

Я использовал NOT IN, чтобы найти идентификаторы сотрудников, которых нет в таблице, поэтому, если запись не существует, время не было введено. Это хорошо работает.

Select 
    e.userName, 
    et.dateStart, 
    et.dateEnd 

From employee_time et, 
     employee e 
Where 
     e.employee_id NOT IN (Select employee_id from employee_time 
          where et.dateStart = date and 
            et.end_date = date) 
Group by 
     e.userName, 
     et.startDate, 
     et.endDate 

Проблема заключается в применении, когда человек переходит на страницу входа времени работника это создать запись для работника, если работник не входит в любое время результата является записью с нулем часов. Но запись теперь существует. Таким образом, не будет найдено в приведенном выше запросе, я использовал следующее, чтобы найти записи, в которых итоговые = 0

Select 
    e.userName, 
    et.dateStart, 
    et.dateEnd, 
    SUM(et.hoursTotal) AS total 

From employee_time et, 
     employee e 
Where 
     e.employee_id = et.employee_id and 
     et.hours_total = 0 
Group by 
     e.userName, 
     et.startDate, 
     et.endDate 

Это также работает хорошо, однако мне нужно жениться на них, но не увенчались успехом до сих пор. Вы можете помочь?

+0

Что фактический выход вы хотите от «брака» этих двух запросов? –

+0

Вы хотите обрабатывать записи с помощью 'hours_total' = 0, как будто их не было? 'where hours_total <> 0'? –

+0

Мой желаемый результат - employee_ids, поэтому я могу получить доступ к имени пользователя и поместить его в отчет, в котором указанное лицо не вводит время. – Bman

ответ

0
Select 
    e.userName, 
    et.dateStart, 
    et.dateEnd, 
    SUM(et.hoursTotal) AS total 

From 
     employee e left outer join employee_time et on (e.employee_id = et.employee_id) 
-- Where nvl(et.hours_total,0) = 0 
Group by 
     e.userName, 
     et.startDate, 
     et.endDate 
having SUM(et.hoursTotal) > 0 

Если вы не хотите, имея вы можете использовать комментировал, где это должно быть то же самое

если вы хотите только employee_ids:

select e.empolyee_id 
from employee e left outer join employee_time et on (e.employee_id = et.employee_id) 
Where nvl(et.hours_total,0) = 0; 
0

Общий формат будет что-то вроде этого:

Select employee_id 
    From employee 
Minus 
Select employee_id 
    From TableExpressionEliminatesOnMissingDates 
Minus 
Select employee_id 
    From TableExpressionEliminatesOnSummarization; 
0

Я бы написать это как:

Select e.userName 
From employee e 
Where e.employee_id NOT IN (Select employee_id 
          from employee_time 
          where et.dateStart = $date and 
            et.end_date = $date and 
            et.hoursTotal > 0 
          ); 

Вы начинаете с даты ввода, так что я не понимаю, зачем вам это нужно. Если да, то я пошел бы для:

Select e.userName, w.* 
From employee e cross join 
    (select distinct et.dateStart, et.end_date 
     from employee_time et 
     where $date between et.dateStart and et.dateEnd 
    ) w 
Where e.employee_id NOT IN (Select et.employee_id 
          from employee_time et 
          where $date between et.dateStart and et.dateEnd and 
            et.hoursTotal > 0 
          ); 

Примечание: Как избежать GROUP BY во внешнем запросе является выигрыш с точки зрения производительности.

0

Следующий запрос находит всех сотрудников, которые не имеют право въезда в employee_time для данной даты начала и завершения:

select * 
from employee 
where employee_id not in 
(
    select employee_id 
    from employee_time 
    where datestart = :date_start 
    and end_date = :date_end 
    and hours_total > 0 
); 
+0

Thorsten, это правильно, но мне также нужны люди, которые никогда не обращались к таблице employee_time, поэтому никаких записей из них не существует. – Bman

+0

Запрос ищет сотрудников, которые не имеют действительной записи в employee_time в заданном диапазоне времени. Это справедливо и для сотрудников, которые вообще не имеют записей в таблице. Вы даже попробовали запрос? –