2014-11-13 3 views
0

Как я могу получить различные значения из внутреннего запроса? Сценарий:Найти различные значения из внутреннего запроса

У меня есть таблица: MyData с колоннами ID и STARTTIME. Идентификатор - это шестнадцатеричная строка , а время начала - отметка времени. Идентификатор и время запуска могут быть нулевыми.

Вот как выглядит таблица:

ID   StartTime 
01655a70 2014-10-24 06:22:03.0 
01655a70 2014-10-24 06:22:03.0 
b752  2014-10-15 03:19:03.0 
b752  <null> 
3922b  2014-10-15 03:19:03.0 
d98cb  <null> 

Я хочу, чтобы получить различные значения идентификаторов, которые не имеют никакого значения NULL в этом время_запуске столбца.

Expected result should be: 

01655a70 
3922b 

Я попытался:

select distinct(ID) from Mydata where ID in (select ID from MyData where id not like '' and starttime is not null) 


select distinct(inner.ID) from (select ID from MyData where id not like '' and starttime is not null) as inner 

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

Также смотрели на SO сообщений:

http://stackoverflow.com/questions/23278387/options-for-returning-distinct-values-across-an-inner-join 

and 

http://stackoverflow.com/questions/13149857/select-distinct-on-inner-join-query-filtering-by-multiple-values-on-a-single-col 

Выбрать, отличный запрос кажется прямо вперед для меня, есть что-то, очевидно, здесь не так?

Дополнительная информация: Моя БД - это база данных MS Access, база данных .accdb.

ответ

0
select t.id from (
    select id, count(*) as n_all, 
      count(starttime) as n_time 
    from Mydata 
    group by id 
) t 
where t.n_all = t.n_time; 

count(*) подсчитывает все строки
count(col) подсчитывает не нулевые значения col

Другой вариант:

select distinct m1.id from Mydata m1 
where not exists (select 1 from Mydata m2 where m2.id = m1.id and m2.starttime is null); 

Ваш запрос:

select distinct(ID) from Mydata 
where ID in (select ID from MyData 
      where id not like '' and starttime is not null); 

id not like '' это условие не проверяет значение null. Используйте id is not null вместо

Подзапрос возвращает все идентификаторы, не имеющие нулевого времени запуска. Таким образом, ваш запрос не проверяет все значения STARTTIME для каждого идентификатора, и это эквивалентно:

select distinct ID from MyData where id not like '' and starttime is not null; 

Второй запрос делает то же самое, что и первый запрос - вы только что добавили псевдоним для подзапроса.

+0

первый вариант, похоже, хорошо работает. Что было по своей сути неправильным в моих запросах, которые я начал. – Ayusman

+0

@Ayusman Я добавил некоторую информацию в свой ответ. Основная проблема в вашем запросе заключается в том, что вы просто фильтруете данные и оставляете только строки с нулевым временем запуска, но вам нужно отсканировать все начальные моменты для каждого идентификатора. – Multisync

+0

оба варианта работают. Благодарю. – Ayusman

Смежные вопросы