Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 888

/ вопрос открыт /

Здравствуйте!
Подскажите, пожалуста, как при помощи запроса (что-то тиа после query1.ExecSQL) выбрать из базы то, подходит под условие (например where string1="test"), и уже из этого оставит 10 последних по дате записей (в таблице есть поле ddate типа Date). После выполнения запроса в таблице (именно в таблице, тк требуется физическое удаление записей из базы) должны остаться все записи, не подходящие под условие string1="test", плюс 10 последних записей, подходящих под него. Заранее спасибо. Если есть ссылки на форумы SQL, буду благодарен.

Приложение:
  1.  
  2. table
  3. string1 Alpha
  4. string2 Alpha
  5. ddate Date


red_88 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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. Если это таблица логов, то, в принципе, такой ситуации быть не должно.

Приложение:
  1. delete from table where (string1='test')and
  2. (select count(*) from table a
  3. 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

red_88 (статус: Посетитель), 9 сентября 2008, 16:37 [#1]:

пардон, совсем забыл написать, что работа ведётся с одной единственной таблицей под paradox, те базы как набора таблиц нет
Вадим К

Вадим К (статус: Академик), 9 сентября 2008, 16:39 [#2]:

BDE?
Галочка "подтверждения прочтения" - вселенское зло.
red_88

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

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

red_88 (статус: Посетитель), 9 сентября 2008, 17:13 [#7]:

спасибо, попробую
red_88

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

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 7 июля 2020, 22:34
Выполнено за 0.01 сек.
Рейтинг@Mail.ru