Выполнение набора вычитания на одном столе - PullRequest
3 голосов
/ 16 марта 2011

У меня есть таблица, в которой хранятся записи о членстве.Одна запись на участника в год.Например:

MEMBER   YEAR
--------------
steve    2011
steve    2010
bob      2010
jane     2011

Я пытаюсь сгенерировать список потерянных участников (тех, кто не обновил) за определенный год.Что-то вроде «получить всех участников, у которых есть запись на 2010 год, но не на 2011 год».

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

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

Использование LEFT JOIN / IS NULL

   SELECT a.member
     FROM YOUR_TABLE a
LEFT JOIN YOUR_TABLE b ON b.member = a.member
                      AND b.year = 2011
    WHERE a.year = 2010
      AND b.member IS NULL

Использование NOT EXISTS

   SELECT a.member
     FROM YOUR_TABLE a
    WHERE a.year = 2010
      AND NOT EXISTS (SELECT NULL
                        FROM YOUR_TABLE b 
                       WHERE b.member = a.member
                         AND b.year = 2011)

Использование NOT IN

SELECT a.member
  FROM YOUR_TABLE a
 WHERE a.year = 2010
   AND a.member NOT IN (SELECT b.member
                          FROM YOUR_TABLE b 
                         WHERE b.year = 2011)

Performance

Производительность зависит от того, являются ли сравниваемые столбцы NULLable (значения могут быть NULL):

0 голосов
/ 16 марта 2011

Если мы упростим эту проблему, то получится: «Получить список участников, которые не обновлялись в течение года x»

Если мы разделим эту проблему, это в основном приведет к получению всех участниковрегистрация меньше указанного года (x).

, поэтому мы можем написать запрос как

select Member from membership where year < 2011

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

Спасибо

Нилеш

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...