Запрос SQL для информации * не * в базе данных - PullRequest
3 голосов
/ 27 июня 2009

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

Я использую SQL Server 2000 , если для этого требуются нестандартные расширения

Ответы [ 6 ]

5 голосов
/ 27 июня 2009

Для огромного списка я бы порекомендовал загрузить этот список во вторую таблицу (например, TEMP_EMAIL_ADDRESS), а затем использовать:

SELECT
  EMAIL
FROM
  TEMP_EMAIL_ADDRESS
WHERE
  EMAIL NOT IN (SELECT EMAIL FROM EMAIL_ADDRESS)

Преобразование данных

Если ваши данные находятся в текстовом файле с именем emails.txt (по одной строке на строку), вы можете создать оператор вставки, используя следующую команду DOS:

FOR /F %i IN (emails.txt) DO echo INSERT INTO TEMP_EMAIL_ADDRESS (EMAIL) VALUES ('%i') >> insert-email.sql

Эта команда создаст новый файл с именем insert-email.sql в текущем каталоге, содержащий все вставки, необходимые для добавления существующего списка адресов электронной почты в базу данных.

4 голосов
/ 27 июня 2009

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

SELECT emailaddress FROM temp_table WHERE emailaddress NOT IN (SELECT emailaddress FROM table)

Вы можете расширить это с помощью INSERT INTO

2 голосов
/ 27 июня 2009

Почему бы вам не импортировать адреса электронной почты в виде таблицы и просто сравнить их с таблицей, которая у вас уже есть?

Кроме этого, вы можете передать список адресов электронной почты как тип данных XML или как тип данных таблицы и запросить их.

1 голос
/ 27 июня 2009

Создайте таблицу "newaddresses", в которой будут все ваши адреса электронной почты для запроса.

Сделайте что-то вроде этого:

(от всей души, синтаксис может быть не на 100% правильным; надеюсь, дает правильное представление)

select n.email
from newaddresses n
left join alreadysubscribed a
    on n.email = a.email
where a.email is null

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

0 голосов
/ 02 июля 2009

Хм ... Никто не упоминал, ЕСЛИ СУЩЕСТВУЕТ. Это была бы моя первая мысль:

IF NOT EXISTS (SELECT * FROM MyTable where MyTable.email = "someemail@somewhere.com

Хотя, возможно, производительность ничем не отличается от NOT IN.

Надеюсь, это поможет.

0 голосов
/ 27 июня 2009

Может быть, вы могли бы создать индекс по электронной почте:

CREATE INDEX email_index ON my_table(email)

, а затем просто проверьте с помощью

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