2015-04-22 3 views
1

У меня есть таблица со многими записями в таблице. Каждый раз, когда вводится запись, дата, в которую была введена запись, также сохраняется в таблице.Как найти отсутствующие записи в одной таблице

Мне нужен запрос, который найдет все недостающие записи в таблице.

Так что, если у меня есть это в моей таблице:

ID   Date   Location 
1   4/1/2015  bld1 
2   4/2/2015  bld1 
3   4/4/2015  bld1 

Я хочу, чтобы выполнить запрос, как

Select Date, Location 
FROM [table] 
WHERE (Date Between '4/1/2015' and '4/4/2015') and (Location = bld1) 
WHERE Date not in (Select Date, Location FROM [table]) 

и результаты должны быть:

4/3/2015 bld1 

Спасибо.

+0

В чем проблема? –

+0

Скажите, что ваша РСУБД предоставит вам решение – jfun

+0

Я имею в виду, какую систему баз данных вы используете? SQL Server, Oracle, PostgreSQL, MySQL, .... !! ??? – jfun

ответ

1

Я полагаю, что вы используете SQL Server, ниже это решение для него, этот метод можно использовать практически для всех СУБД.

Чтобы найти пробелы нужно иметь последовательность дат между min и max даты в вашей таблице, вы можете создавать их с recursive cte, наконец left joincte на ваш стол и возьмите запись, где указаны значения таблицы null:

Схема:

create table ttbl(ID int,[Date] date,Location varchar(10)); 
insert into ttbl values 
(1,'4-1-2015','bld1'), 
(2,'4-2-2015','bld1'), 
(3,'4-4-2015','bld1'); 

Запрос:

declare @startDate date=(select min(date) from ttbl) 
declare @endDate date=(select max(date) from ttbl) 
--this generates the required sequence of dates between min and max dates in the table: 
;with dts as 
(
    select @startDate dt 
    union all 
    select dateadd(dd, 1, d.dt) 
    from dts d 
    where dateadd(dd, 1, d.dt) <= @endDate 
    ) 
--this finds the gaps: 
select d.dt, 
     (select top 1 Location from ttbl) 
from dts d 
left join ttbl t on d.dt=t.date 
where t.id is null 

Выход:

2015-04-03 bld1 
Смежные вопросы