Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исключение записей по маске, помогите сделать правильный запрос 
:(
    Опции темы
Sor
Дата 4.11.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.11.2006

Репутация: нет
Всего: нет



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

подскажите как сделать...
PM MAIL   Вверх
Akina
Дата 5.11.2006, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Поскольку количество масок заранее не определено, влоб на 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
)


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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Sor
Дата 5.11.2006, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.11.2006

Репутация: нет
Всего: нет



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

Кстати, насколько длинный может быть запрос?
PM MAIL   Вверх
Akina
Дата 5.11.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



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

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

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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Sor
Дата 5.11.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.11.2006

Репутация: нет
Всего: нет



запрос который я привел в качестве примера - работает
поэтому про длину запроса и спросил, если у меня масок будет 100 или 1000, прожует аксесс это или нет?
PM MAIL   Вверх
bopoha
Дата 10.11.2006, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 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
PM MAIL WWW ICQ Skype GTalk   Вверх
bopoha
Дата 12.11.2006, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



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

PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.