Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как получить список несуществующих записей / 7 сообщений из 7, страница 1 из 1
30.11.2013, 15:13:00
    #38484436
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить список несуществующих записей
Вопрос наверное странный, но я не удивлюсь, если в MySQL и такое есть...

К примеру есть таблица `Table` с одним полем `NumRec` (не автоинкремент).
Три записи:
23
24
25

Запрос: SELECT `NumRec` FROM `Table` WHERE `NumRec` In(23,30,31);
вернёт одну запись `NumRec`=23.

Мне нужно определить наоборот - каких `NumRec` в таблице ещё нет (чтобы их добавить).
Т.е. нужен такой запрос, который вернёт 2 записи:
`NumRec`=30, `NumRec`=31.

Возможно ли такое вообще?
...
Рейтинг: 0 / 0
30.11.2013, 20:23:31
    #38484630
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить список несуществующих записей
Алексей Смирнов,

например так:
Код: sql
1.
2.
3.
4.
5.
SELECT `NumRec`FROM (
  SELECT 23 AS num UNION ALL 30 UNION ALL 31
) AS t
LEFT JOIN `table` AS s ON t.`num` = s.`NumRec`
WHERE t.`num` IS NULL
...
Рейтинг: 0 / 0
30.11.2013, 20:25:03
    #38484632
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить список несуществующих записей
Arhat109,

пардон, случайно на Enter нажал до проверки. Правильно так:

Код: sql
1.
2.
3.
4.
5.
SELECT t.`num`FROM (
  SELECT 23 AS num UNION ALL 30 UNION ALL 31
) AS t
LEFT JOIN `table` AS s ON t.`num` = s.`NumRec`
WHERE s.`NumRec` IS NULL
...
Рейтинг: 0 / 0
30.11.2013, 20:38:36
    #38484637
Kulavert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить список несуществующих записей
Алексей Смирнов,
получить результат одной командой (не считая запуска ХП) врядли получится, но предлагаю такую последовательность:
Я догадываюсь, что содержимое скобок для оператора IN вы генерируете в текстовом виде внутри вашего приложения, поэтому
1) создайте на время сессии (или на лету) временную табличку с одним полем для хранения ваших NumRec;
2) добавьте в нее строки, содержащие все испытуемые NumRec из списка оператора IN. Это можно сделать одним инсертом
Код: sql
1.
INSERT INTO TempTable (NumRec) VALUES(23),(30),(31)

;
3) сделайте Селект пересечения вашей 'Table' и временной таблицы, выбрав только строки, в которых TempTable.NumRec есть, а Table.NumRec нет.
...
Рейтинг: 0 / 0
30.11.2013, 20:43:50
    #38484639
Kulavert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить список несуществующих записей
А вот и Arhat109 тоже самое предложил, только вместо временной таблицы делает набор строк с помощью UNION. Какой из вариантов будет быстрее, эффективнее по ресурсам и удобнее в работе - вам решать в зависимости от условий вашего приложения.Мень заморочек конечно в варианте Архата.
...
Рейтинг: 0 / 0
30.11.2013, 21:33:33
    #38484656
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить список несуществующих записей
Arhat109, Kulavert, спасибо, да хорошие ответы.

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

Просто думал, может авторы MySQL все же придумали какую-нибудь конструкцию... чтобы SELECT мог сам генерировать несуществующие записи.

Вообще мне это нужно, чтобы синхронизировать записи базы формата Microsoft Access и MySQL, а именно через какой-то промежуток времени новые данные подгружать в MySQL. Вариант Arhat109 громоздский, т.к. таблиц и записей в базе очень много. Вариант Kulavert получше, но все равно создавать в MySQL ID всех записей всех таблиц так же слишком громоздско.

Решил в каждой таблице базы MDB создать поле, в котором будет сохраняться признак - добавлена ли эта запись в базу MySQL. Если False, значит добавляем. Единственный выход.
...
Рейтинг: 0 / 0
30.11.2013, 23:00:44
    #38484707
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить список несуществующих записей
Алексей Смирнов,

Мой ХШ кажет, что Вам надо левый джойн с источником цифирек безо всяких юнионов и времянок. :)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как получить список несуществующих записей / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]