SQL, чтобы найти, какие члены имеют только нулевые записи

Я ломаю голову, пытаясь понять, какой группой и / или count() формирование помочь с этим, но в настоящее время нарисовали пустым.

Рассмотрим таблицу:

PersonId | PlaceName
---------+----------
    1    |   NULL
    1    |   NULL
    2    |   NULL
    2    | Las Vegas
    3    | London
    4    |   NULL
    4    |   NULL
    4    |   NULL

Я ищу людей, которые не удосужились заполнить "названия мест", поэтому я хочу, чтобы мой вывод выглядел так:

PersonId
--------
    1
    4

На самом деле я присоединюсь к некоторым другим столам, чтобы вытащить информацию о каждом "негодяйском" человеке, но суть моей проблемы - та, что выше.

5 ответов

Решение

Используйте следующий запрос:

SELECT PersonId
  FROM TheTable
 GROUP BY PersonId
 HAVING COUNT(PlaceName) = 0

COUNT() агрегатная функция игнорирует NULLs, поэтому правильный результат должен быть возвращен.

select distinct t1.id
from test t1
LEFT JOIN
(
  select id, count(name) nm
  from test 
  where name is not null
  group by id
) x
  on t1.id = x.id
where x.nm is null

Смотрите SQL Fiddle с демо

select PersonId
from MyTable
group by PersonId
having count(case when PlaceName is not null then 1 end) = 0

Пример SQL Fiddle

SELECT DISTINCT PersonId
FROM MyTable t
WHERE NOT EXISTS(SELECT 1 FROM MyTable WHERE PersonId = t.PersonId AND PlaceName is not null)

Я бы предложил следующее:

select distinct a.personid 
  from tablename a
  left outer join tablename b
    on a.personid=b.personid
   and b.placename is not null
 where b.personid is null
order by personid
Другие вопросы по тегам