Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Исключение записей по маске


Автор: Sor 4.11.2006, 15:05
Вопрос в следующем:
есть две таблички, в одной значения
123
234
345
456
В другой указаны маски
1
6
Нужен запрос который выводит разность таблиц относительно маски, т.е. на выходе табличка
234
345

подскажите как сделать...

Автор: Akina 5.11.2006, 00:19
Поскольку количество масок заранее не определено, влоб на SQL тут не вывернуться - MS Jet SQL не признает Match, а Like использовать не удастся.

Однако задача решаема.

Решим ее сначала построением нескольких запросов.

Запрос Q1 - просто посчитает нам количество масок.
Код

Select Count(Field2) As Count2
From Table2


Запрос Q2 перемножит нам таблицы, и для каждой строки определит вхождение маски в строку
Код

Select Table1.Field1, Table2.Field2, Iif(Instr(Table1.Field1;Table2.Field2)>0;1;0) As MaskMatch
From Table1, Table2


Запрос Q3 Сгруппирует результаты запроса Q2
Код

Select Field1, Sum(MaskMatch) As Count1
From Q2
Group By Field1


И, наконец, следующий запрос сравнит результаты запросов Q1 и Q3, выведя только те строки, где равенство (т.е. не найдено ни единого совпадения с маской)
Код

Select Field1
From Q3
Where Count1 In 
(
   Select *
   From Q1
)


На глаз это должно заработать. Если нет - ищи и исправляй ошибки в реализации логики. А когда отладишь - просто собери все это в один запрос.

Автор: Sor 5.11.2006, 07:29
Спасибо, сейчас попробую.
А то в голову ничего не приходит кроме сбора строчки вида
SELECT * FROM table1 WHERE table1.field1 NOT LIKE ("*mask1*") AND table1.field1 NOT LIKE ("*mask2*") .....

Кстати, насколько длинный может быть запрос?

Автор: Akina 5.11.2006, 13:01
Цитата(Sor @  5.11.2006,  08:29 Найти цитируемый пост)
то в голову ничего не приходит кроме сбора строчки вида

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

Цитата(Sor @  5.11.2006,  08:29 Найти цитируемый пост)
насколько длинный может быть запрос? 

Да тебе-то какой не наплевать? пусть Аксесс разбирается...

Автор: Sor 5.11.2006, 13:47
запрос который я привел в качестве примера - работает
поэтому про длину запроса и спросил, если у меня масок будет 100 или 1000, прожует аксесс это или нет?

Автор: bopoha 10.11.2006, 02:21
Есть такой вариант:
Код

SELECT [data].[num] FROM [data] WHERE [data].[num] not in ( SELECT [data].[num] FROM data INNER JOIN mask ON [data].[num] Like [mask].[mask];);


только он очень медленный.

и побыстрее:

Код

SELECT [data].[num], [mask].[mask] FROM [data], [mask] WHERE [data].[num] like [mask].[mask];


рекомендую использовать второй вариат

для простоты маска это:
*1*
*6*

запросы выполнялись в Access 2003

Автор: bopoha 12.11.2006, 03:49
В последней инструкции небольшая ошибочка, забыл про NOT. И работает она верно толькое без NOT, т.е. когда нужно выбрать все записи удовлетворяющие маскам.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)