| 
| 
 | Вопрос # 1 888/ вопрос открыт / | 
 |  Здравствуйте!Подскажите, пожалуста, как при помощи запроса (что-то тиа после query1.ExecSQL)  выбрать из базы то, подходит под условие (например where string1="test"), и уже из этого оставит 10 последних по дате записей (в таблице есть поле ddate типа Date). После выполнения запроса в таблице (именно в таблице, тк требуется физическое удаление записей из базы) должны остаться все записи, не подходящие под условие string1="test", плюс 10 последних записей, подходящих под него. Заранее спасибо. Если есть ссылки на форумы SQL, буду благодарен.
 
|  |   Вопрос задал: red_88 (статус: Посетитель)Вопрос отправлен: 9 сентября 2008, 16:10
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, red_88!А база какая? в плане оконных функций, синтаксис sql немного отличается. Например для MSAccess будет где то так
 select top 10 string1, string2, ddate from table order by ddate desc
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 9 сентября 2008, 16:24
 
 |  Ответ #2. Отвечает эксперт: Мережников Андрей Здравствуйте, red_88!Для MS SQL 2000 работает следующий запрос (смотри приложение). На BDE проверить возможности нет.
 Единственный нюанс - будет работать с ошибкой, если в таблице больше одной записи с одинаковыми значениями string1 и ddate. Если это таблица логов, то, в принципе, такой ситуации быть не должно.
 Приложение:Переключить в обычный режим delete from table where (string1='test')and(select count(*) from table a where (string1='test')and(a.ddate<table.ddate))<(select count(*) from table where
string1<'test')
|  | Ответ отправил: Мережников Андрей (статус: Абитуриент)Время отправки: 9 сентября 2008, 17:49
 
 |  
 Мини-форум вопросаВсего сообщений: 11; последнее сообщение — 9 сентября 2008, 17:56; участников в обсуждении: 3. 
|   | red_88 (статус: Посетитель), 9 сентября 2008, 16:37 [#1]:пардон, совсем забыл написать, что работа ведётся с одной единственной таблицей под paradox, те базы как набора таблиц нет |  
|   | Вадим К (статус: Академик), 9 сентября 2008, 16:39 [#2]:BDE? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | red_88 (статус: Посетитель), 9 сентября 2008, 16:43 [#3]:не совсем понял вопроса. что значит "BDE?" таблица создана через Database Desctop, подключаюсь к ней через TTable и TQuery. Лежит она рядом с проектом и пишутся туда помельнечку логи, но периодически их надо удалять, а делать каждый раз сортировку и delete from, те удалять в три этапа, кажется, кривовато |  
|   | Вадим К (статус: Академик), 9 сентября 2008, 16:50 [#4]:Ну Вы сами подтвердили, что BDE. Советую поскорее отказываться от этой устаревшей технологии - потом будут большие проблемы. К тому же уже лет 5, как BDE не поддерживается произовдителем. для удаления делается выборка и delete from. А где же третий этап?
 Хотя может я чего то не понимаю. В момент читки логов Вы то знаете,сколько надо удалить. Например можно удалять "вчерашние логи", это будет выглядеть где то так
 delete from mytable where ddate < 'дата'
 где вместо "дата" подставляем вчерашню дату, полученную с помощью DateToStr(now-1);
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | red_88 (статус: Посетитель), 9 сентября 2008, 17:00 [#5]:Вы считаете, что надо переходить на ADO? три этапа я имел в виду выборку, удаление и дальнейшую выборку результата, просто пропустил этот момент как не суть важный, он уже реализован. Для меня вопрос в другом-как реализовать удаление отобранных записей, тем более что надо удалять не первые 10, а все, кроме первых 10?
 При чистке я НЕ знаю, с какого числа надо удалять записи. По заданию должны оставаться последние 10 записей по пользователю (назовём его лучше так), но когда были последние его посещения-неизвестно, мб последние 10 были в этом месяце, а мб в прошлом году.
 |  
|   | Вадим К (статус: Академик), 9 сентября 2008, 17:10 [#6]:Ну если у Вас одна таблица, то тут может быть хорошим SQLite, статья по нему есть на сайте в разделе Статьи. Если не надо выводить в DBGrid, а занимаетесь выводом самостоятельно, то точно хорошее решение. По поводу удаления. Вначале делаете запрос, как я показал. Потом берём минимальную дату (она будет последней в выборке) и делаете запрос вида
 delete from MyTable where ddate < 'дата'
 Не надо бояться делать два или три запроса. Это БД и она предназначена для выполнения запросов. Правда не стоит перегибать.
 Но я не знаю, сможет ли BDE выполнить вышеуказанный запрос.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | red_88 (статус: Посетитель), 9 сентября 2008, 17:13 [#7]:спасибо, попробую |  
|   | red_88 (статус: Посетитель), 9 сентября 2008, 17:47 [#8]:во фразе 'select top 10 ddate from  table' ругается на "10".... пробовал ставить 10 в двойные кавычки, ругается на from, что я мог накосячить в запросе из 5 слов?
 |  
|   | Мережников Андрей (статус: Абитуриент), 9 сентября 2008, 17:51 [#9]:Прошу прощения, конечно же последнее условие : string1='test', а не string1<'test' |  
|   | Вадим К (статус: Академик), 9 сентября 2008, 17:51 [#10]:а кто выполняет запрос, BDE? Я же написал, что этот запрос правильный для MSSQL и MSAccess. А как с BDE - я даже не знаю - никто не использует его.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Мережников Андрей (статус: Абитуриент), 9 сентября 2008, 17:56 [#11]:"накосячить" в запросе можно легко - в Вашем случае скорее всего ошибка в местоположении ключевого слова top 10 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |