Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Отобрать значения соответствующие условию (интересны идеи)
 
 автор: osmor   (12.12.2009 в 20:33)   личное сообщение
 
 

есть набор данных числа от 0 до 100 000 000
нужно отобрать все записи которые соответствуют условию
<> 1 000 000
<> 1 000 001
<> 2 000 000
<> 3 000 000
......
<> 7 000 000
<> 8 000 000

то есть значение НЕ должно быть либо целым миллионом, 2-мя миллионами и так до 8 миллионов и НЕ равно 1 000 001

пока написал такое условие, в принципе устраивает
... where id > 8000000 or (id\1000000 <> id/1000000 and id <> 1000001)

но может есть другие идеи

  Ответить  
 
 автор: Гоблин   (12.12.2009 в 22:23)   личное сообщение
 
 

Я пас. Круче некуда. Разве что Лукас выдаст нечто.

  Ответить  
 
 автор: Lukas   (12.12.2009 в 23:06)   личное сообщение
5 Кб.
 
 

Мне показалось(?), при таком описании условия работает быстрее раза в 1,5-2:

WHERE
ID < 999999 OR
ID Between 1000002 AND 1999999 OR
ID Between 2000001 AND 2999999 OR 
ID Between 3000001 AND 3999999 OR
ID Between 4000001 AND 4999999 OR
ID Between 5000001 AND 5999999 OR
ID Between 6000001 AND 6999999 OR
ID Between 7000001 AND 7999999 OR
ID > 8000000

А так нагляднее, но выигрыша в скорости нет:

WHERE ID Not In (1000000,1000001,2000000,3000000,4000000,5000000,6000000,7000000,8000000) Or (ID>8000000)

  Ответить  
 
 автор: Гоблин   (12.12.2009 в 23:07)   личное сообщение
 
 

Ну вот. Я же говорил.

  Ответить  
 
 автор: osmor   (13.12.2009 в 09:27)   личное сообщение
 
 

Привычка искать "общее" решение, часто создает внутренний барьер не "позволяющий" использовать простое перечисление.
Из-за этого даже не подумал просто описать все условия... а перечислению не так уж много, а выигрыш в 2 раза по любому хорошо.
Спасибо.
Ща еще поработаю, потом схожу в баню, а потом выдам еще задачку на проверку состава строки.

  Ответить  
 
 автор: Гоблин   (13.12.2009 в 13:38)   личное сообщение
 
 

А я думал это по части кто аригинальнее сократит строку и выдумает нечто более изощренное. А так первое что в голову пришло так это between но он избит уже.

  Ответить  
 
 автор: Lukas   (13.12.2009 в 15:35)   личное сообщение
 
 


...числа от 0 до 100 000 000...


При таких объемах данных сокращать надо не длину строки условия, а время выполнения запроса.
Попутно обнаружилось:
условие ...(id\1000000 <> id/1000000 and id <> 1000001) не возвращает строку с ID=0.

  Ответить  
 
 автор: Гоблин   (13.12.2009 в 17:09)   личное сообщение
 
 

звиняюсь за невежество. ID как понимаю - счетчик. 0 - это типа ничего нет (добавление записи) и накой оно нам в результате запроса?

  Ответить  
 
 автор: Lukas   (13.12.2009 в 17:50)   личное сообщение
 
 


ID как понимаю - счетчик


Не обязательно.


0 - это типа ничего нет


Категоричное нет!
0 - это математическое значение, в отличие от Null.


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


Для этого:


osmor (12.12.2009 в 20:33)
есть набор данных числа от 0 до 100 000 000
...

  Ответить  
 
 автор: Гоблин   (13.12.2009 в 19:17)   личное сообщение
 
 

И в пух и в перья. Только щепки разлетелись.
Но если ID принять за счетчик, то не так уж я и не прав.

  Ответить  
 
 автор: Lukas   (13.12.2009 в 21:07)   личное сообщение
11 Кб.
 
 

Ну вот в примере ID-счетчик.
Добавь в таблицу t1 десяток значений и посмотри на значения ID.

  Ответить  
 
 автор: Гоблин   (13.12.2009 в 22:34)   личное сообщение
 
 

Ну блин, такие извращения уже слишком. Это уже за пределами грани неприличия.
А этот запрос выше всякого понимания.
Добил окончательно.

PS А можно с помощью вот такой штуки заставить счетчик считать всегда по порядку? С функцией max например. Или с пересчетом, если удаляем что внутри таблы.
Лукас, вы можете. Я знаю. Переделайте модуль счетчика.

  Ответить  
 
 автор: Lukas   (13.12.2009 в 23:13)   личное сообщение
 
 

1. Счетчик и так всегда считает по порядку, заданному либо при его создании, либо при последнем изменении.
2. Не следует из счетчиков организовывать нумерацию событий, документов и т.д.
3. Если все-таки хочется, что бы значения счетчика не имели разрывов в последовательности,
можно не удалять записи, а присваивать ее полям (кроме счетчика) либо Null (для тех полей где разрешено), либо значения по умолчанию для тех полей, где Null запрещен.
При добавлении:
сначала искать такие "очищенные" записи, и если такая есть, то делать не вставку новой записи,
а обновление значений полей "очищенной" записи.
Если "очищенных" записей нет, тогда вставку новой записи, как обычно.

  Ответить  
 
 автор: osmor   (14.12.2009 в 10:31)   личное сообщение
 
 

ID как понимаю - счетчик. 0 - это типа ничего нет (добавление записи) и накой оно нам в результате запроса?


В данном случае id - это не счетчик, это некий идентификатор определяющий принадлежность к определенной группе. т.е. в моем случае он даже не уникальный.
В предметной области заказчика этот атрибут сущности называется "ИД" (АйДи), вот я поле под него и назвал ID.

  Ответить  
 
 автор: osmor   (14.12.2009 в 10:25)   личное сообщение
 
 

да с 0 я пролетел ...
Кстати надо уточнить у заказчика 0 вообще-то возможен...
Вообще в таблице описывающей диапазоны (есть такая), 0 присутствует, а вот может ли быть реально нужно уточнить...
Но по любому, мое условие нужно менять.

  Ответить  
 
 автор: Lukas   (14.12.2009 в 13:41)   личное сообщение
 
 

А где-же


...задачку на проверку состава строки


Интересно ж. Небось ужо сам порешал втихую, а мы ждем.

  Ответить  
 
 автор: osmor   (14.12.2009 в 13:44)   личное сообщение
 
 

да я ее почти сделал, а сформулировать времени не нашел...
К крестнице и ее маме ходил на ДР, у них разница в один день + несколько лет :-)
там все не сложно... к вечеру может набросаю.

  Ответить  
 
 автор: Lukas   (14.12.2009 в 13:57)   личное сообщение
 
 

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

  Ответить  
 
 автор: АлексейЕ   (14.12.2009 в 14:08)   личное сообщение
 
 

"id\1000000 <> id/1000000" можно заменить на "id mod1000000 <> 0"

  Ответить  
 
 автор: Lukas   (14.12.2009 в 14:12)   личное сообщение
 
 

Я пробовал, но у меня работает медленнее, чем с делениями.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList