Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос на удаление, Помогите написать запрос (BDE/Paradox): 
:(
    Опции темы
Dynamic
Дата 21.4.2005, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Привет! Помогите написать запрос (BDE/Paradox):

есть таблица, типа

St_Id St_Name1 St_Name2 St_Name3 St_BirthDay St_DateVid

Код

1. Петров Иван Иванович 1963 1.01.2005
2. Петров Иван Иванович 1963 1.03.2003
3. Иванов Иван Петрович 1975 12.09.2002
4. Иванов Иван Петрович 1975 12.11.2005
5. Сидоров Николай Петрович 1987 1.04.2002


в таблице надо оставить только неповторяющиеся записи с максимальным значением Даты, т.е., чтобы получилось так:

Код

1. Петров Иван Иванович 1963 1.01.2005
4. Иванов Иван Петрович 1975 12.11.2005
5. Сидоров Николай Петрович 1987 1.04.2002


Выбрать такие записи получается, а вот правильно удалить - нет.
Так выбираю:

Код

select st_name1,st_name2,st_name3,st_birthday, max(st_datavid) as maxdate from strax
group by st_name1,st_name2,st_name3,st_birthday
having count(*)>1

Получается
Код

Петров Иван Иванович 1963 1.01.2005
Иванов Иван Петрович 1975 12.11.2005

Который час бьюсь
Заранее спасибо всем ответившим.

Это сообщение отредактировал(а) Dynamic - 21.4.2005, 17:00


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
Негодяй
Дата 21.4.2005, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Порядочный
***


Профиль
Группа: Завсегдатай
Сообщений: 1513
Регистрация: 13.2.2005
Где: Kazakhstan, Almat y

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



Цитата
having count(*)>1)


эх, подзабыл уже всё на фиг, но может в этом проблема? и есть заменитель вроде как этой операции просто запретить дублирование? а не как в твоём случае который машина понимает наверное как "именно опираясь на запрос, где больше 1 значит мне это и нужно"?

Это сообщение отредактировал(а) Негодяй - 21.4.2005, 15:07
PM MAIL   Вверх
Dynamic
Дата 21.4.2005, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Смысл в том, что мне нужно профильтровать таблицу на наличие дубликатов записей о клиентах. Если клиент внесен один раз, то мы его пропускаем, если 2 и больше, то оставляем только того, у которого более поздняя дата St_DataVid, остальных удаляем.

После моего запроса в НД попадают как раз те данные, клиентов с которыми надо оставить. Но вот что делать дальше - ума не приложу. smile


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
Негодяй
Дата 21.4.2005, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Порядочный
***


Профиль
Группа: Завсегдатай
Сообщений: 1513
Регистрация: 13.2.2005
Где: Kazakhstan, Almat y

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



Цитата
select * from
(select st_name1,st_name2,st_name3,st_birthday, max(st_datavid) from strax
group by st_name1,st_name2,st_name3,st_birthday
having count(*)>1)

а если сначала поудалять минимальные значения st_datavid (вместо max - min), цикл не заканчивать пока запрашиваемая запись (count) не будет равна 1;
затем повторить вышеописанный запрос без параметра having...?;

а если вместо всего так сделать having count(*)>=1?

Это сообщение отредактировал(а) Негодяй - 21.4.2005, 16:00
PM MAIL   Вверх
Dynamic
Дата 21.4.2005, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Там в первом посте ошибочка закралась в текст запроса (от одного тестового прогона), уже убрал. Суть не меняется.
Цитата
having count(*)>=1

Тогда Having можно вообще убрать. Над остальным думаю...



--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
Dimich
Дата 22.4.2005, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Тут видится следующая технология:
Код

delete strax where
(St_Name1, St_Name2, St_Name3, St_BirthDay, St_DateVid) not in
(
select st_name1,st_name2,st_name3,st_birthday, max(st_datavid) as maxdate from strax
group by st_name1,st_name2,st_name3,st_birthday
having count(*)>=1
)

--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Dynamic
Дата 22.4.2005, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сдается мне, что производится попытка удаления ВСЕХ записей, КРОМЕ тех, что удовлетворяют выборке, т.е. и "одиночных" тоже.

Это сообщение отредактировал(а) Dynamic - 22.4.2005, 17:29


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
Golden Hands
Дата 23.4.2005, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Золотой
****


Профиль
Группа: Участник Клуба
Сообщений: 2023
Регистрация: 23.1.2005
Где: Екатеринбург

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



Почтенные, не мучайтесь.
Вот правильный Select (насколько я понял САБЖ):

Код

SELECT st_name1,st_name2,st_name3,st_birthday, max(st_datavid) as maxdate
From strax
Group By st_name1,st_name2,st_name3,st_birthday;


И, соответственно, Delete:

Код

Delete *
From  strax
where (St_Name1, St_Name2, St_Name3, St_BirthDay, St_DateVid) not in
(
SELECT st_name1,st_name2,st_name3,st_birthday, max(st_datavid) as maxdate
From strax
Group By st_name1,st_name2,st_name3,st_birthday
);



--------------------
Мы обречены... но только на победу!
Настанет день, и мы построим новый дом.
Внесем в него тепло, что сохранить сумели,
И воскресим все то, что в нас когда-то умерло... © Тень Света
PM MAIL ICQ   Вверх
Dynamic
Дата 26.4.2005, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да вроде пришли к мнению, что Парадокс не поддерживает вложенные селекты.


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
Golden Hands
Дата 26.4.2005, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Золотой
****


Профиль
Группа: Участник Клуба
Сообщений: 2023
Регистрация: 23.1.2005
Где: Екатеринбург

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



И то правда, не поддерживает.
Вот, если интересно - http://forum.vingrad.ru/index.php?showtopic=14299


--------------------
Мы обречены... но только на победу!
Настанет день, и мы построим новый дом.
Внесем в него тепло, что сохранить сумели,
И воскресим все то, что в нас когда-то умерло... © Тень Света
PM MAIL ICQ   Вверх
Dimich
Дата 27.4.2005, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну тогда только навигационным методом можно решить эту задачу, т.е. писать процедуру.
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
innok
Дата 28.4.2005, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



решалась похожая проблема, т.е. надо было выбрать наименование организации с максимальной датой. Мож удастся приспособить:
Код

select N.Id, N.Wrkcode,  N.Wrkname,  (select max(I.Datechange)
from Nameorg I where (I.Wrkcode = N.Wrkcode)) as MAX_DATE
from Nameorg N where (N.Datechange = (select max(I.Datechange) 
from Nameorg I where (I.Wrkcode = N.Wrkcode)))
order by Wrkcode 



[code=delphi]

Это сообщение отредактировал(а) innok - 28.4.2005, 14:45
PM MAIL   Вверх
Dynamic
Дата 3.5.2005, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Dimich @ 27.4.2005, 07:19)
Ну тогда только навигационным методом можно решить эту задачу, т.е. писать процедуру.

НаписАл уже (TQuery + TTable).


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
ТоляМБА
Дата 19.5.2005, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


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

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



Есть вариант с исользованием только SQL (без TTable), правда придется создавать одну промежуточную таблицу. Если устраивает такой вариант - телеграфируй, напишу
PM   Вверх
Dynamic
Дата 19.5.2005, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо, уже не надо: я перевожу проект на FireBird, попытаюсь переделать сабж через вложенные select'ы, как мне подсказывали ранее


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

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

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


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

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


 




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


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

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