|
Вопрос # 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
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|