Присоединиться или подзапрос, чтобы «обнаружить пропущенные записи»? - PullRequest
0 голосов
/ 02 апреля 2012

Я изо всех сил пытаюсь заставить этот запрос работать.

У меня есть 2 таблицы, которые содержат код страны 'US' или 'AU' или 'JP' - это общий ключ.

ВЫБЕРИТЕ DISTINCT cc ОТ geo_world;SELECT cc FROM geo_country;

Примечание: geo_world - это большая таблица с миллионами записей, но только 124 различными значениями cc.

Примечание: geo_country содержит только 244 значения cc.

Я хочу узнать значения cc в geo_country, которые не отображаются в geo_world.Их должно быть 120.

спасибо - я пробовал присоединения, но не смог получить результат.

Ответы [ 3 ]

4 голосов
/ 02 апреля 2012

В принципе, любой из них должен работать:

SELECT cc
  FROM geo_country
 WHERE cc NOT IN
        ( SELECT cc                 -- or SELECT DISTINCT cc
            FROM geo_world
        )
;

SELECT cc
  FROM geo_country
 WHERE NOT EXISTS
        ( SELECT 1
            FROM geo_world
           WHERE cc = geo_country.cc
        )
;

SELECT geo_country.cc
  FROM geo_country
  LEFT
 OUTER
  JOIN geo_world
    ON geo_world.cc = geo_country.cc
 WHERE geo_world.cc IS NULL             -- i.e., the join failed
;

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

0 голосов
/ 02 апреля 2012

Вы можете использовать НЕ СУЩЕСТВУЕТ условие. Вы можете сделать это так:

SELECT cc FROM geo_country WHERE 
NOT EXISTS (SELECT * from geo_world WHERE geo_world.cc = geo_country.cc);
0 голосов
/ 02 апреля 2012
SELECT DISTINCT cc
FROM geo_world
WHERE cc NOT IN (SELECT cc FROM geo_country)

Некоторые примечания:

  1. Убедитесь, что geo_world имеет индекс, который охватывает cc
  2. Если вам нужно делать это регулярно - вы, вероятно,лучше денормализовать данные и хранить неиспользуемые коды стран в другой маленькой таблице из 100 или более строк, как некий кэш
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...