![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
удаление повторяющихся записей в таблице [D7, IB6.x]
Mery © (2009-07-21 14:07:00)Каким образом удалить из таблицы записи-дубли? Если создаю уникальный индекс, то при атоматическом добавлении записей в эту таблицу выходит сообщение о нарушении индекса. Хочется, чтоб никаких сообщений не выдавалось, а запись не добавлялась.
makz (2009-07-24 13:34:00) [1]DELETE FROM TABLE1 t1
WHERE EXISTS (
SELECT 1 FROM TABLE1 t2
WHERE t1.COL1 = t2.COL1 and t1.COL2 = t2.COL2
AND t1.RDB$DB_KEY < t2.RDB$DB_KEY
)
Mery (2009-07-23 08:44:00) [2]>Виталий Панасенко(дом) (23.07.09 08:31) [20]
за ссылку спасибо. просто ни разу не использовала процедуры. нужно будет поучиться, согласна.
Mery (2009-07-23 08:42:00) [3]>Виталий Панасенко(дом) (23.07.09 08:31) [20]
вопрос как их использовать, если вызвана вставка в таблицу из процедуры
Виталий Панасенко(дом) (2009-07-23 08:31:00) [4]если б еще эти самые генераторы научиться использовать...:-) www.ibase.ru, точнее http://ibase.ru/devinfo/generator.htm
Mery (2009-07-23 08:18:00) [5]Спасибо за ответ.
При вызове процедуры из приложения возникает ошибка: при выполненнии insert в таблицу автоматически не генерируется первичный ключ этой таблицы, хотя генератор задан.
HandBrake (2009-07-22 20:54:00) [6]To turbouser___ (22.07.09 15:27) [16]
Спасибо!
Читать мне не перечитать основы SQL. Даже стыдно...
Ладно, зато Урок.
HandBrake (2009-07-22 15:33:00) [7]To PEAKTOP ©
Спасибо, реально тормознул:)
turbouser___ (2009-07-22 15:27:00) [8]:)
PEAKTOP (2009-07-22 15:04:00) [9]
> where
> CAST((T1.DATE1+30) as char(10)) || CAST(T1.MEN1 as varchar(18))
> not in (select distinct
> CAST((T3.DATE2) as char(10)) || CAST(T3.MEN2
> as varchar(18))
> from
> Table2 T3);
> END
С ума сойти ...
CREATE PROCEDURE PR_NODUPLICATES AS
BEGIN
insert into Table2
(date2, men2)
select
T1.DATE1+30,
T1.MEN1
from
Table1 T1
where NOT(EXISTS(SELECT T3.DATE2 FROM TABLE2 T3 WHERE (T3.DATE2 = (T1.DATE1+30)AND(T3.MEN2 = T1.MEN1))));
END
HandBrake (2009-07-22 14:36:00) [10]Пообедал. Добрый:).
Уважаемый Кщд, я так понял, Вы о "large cost".
Знаю и согласен с Вами: сам и предупредил об этом, хотя, может и объяснил не очень здорово.
К базе не подойду, пока не прочитаю все ссылки о correlated subquery:)
Существует способ вычислить вставляемые строки способом отличным от моего в операторе SELECT?
Если Да, приведете код такого SELECTа, буду признателен, а то я чего то торможу.
Кщд (2009-07-22 13:20:00) [11]>HandBrake (22.07.09 12:53) [11]
CAST((T1.DATE1+30) as char(10)) || CAST(T1.MEN1 as varchar(18))
not in (select distinct
CAST((T3.DATE2) as char(10)) || CAST(T3.MEN2 as varchar(18))
from
Table2 T3)
читать про correlated subquery
только потом подходить к базе
turbouser___ (2009-07-22 13:15:00) [12]
> HandBrake
>not in (select distinct
NOT EXISTS(...тогда уж...
HandBrake (2009-07-22 12:53:00) [13]To Mery
Может Вам это подойдет (если я Вас правильно понял)?
CREATE TABLE TABLE1
(
DATE1 DATE,
MEN1 INTEGER
);
CREATE TABLE TABLE2
(
DATE2 DATE,
MEN2 INTEGER
);
и хранимка для Вашей кнопочки
CREATE PROCEDURE PR_NODUPLICATES AS
BEGIN
insert into Table2
(date2, men2)
select
T1.DATE1+30,
T1.MEN1
from
Table1 T1
where
CAST((T1.DATE1+30) as char(10)) || CAST(T1.MEN1 as varchar(18))
not in (select distinct
CAST((T3.DATE2) as char(10)) || CAST(T3.MEN2 as varchar(18))
from
Table2 T3);
END
просто такой подход плох на больших объемах: условие Whereидет с перегрузкой, Вы можете вообще не дождаться окончания операции. Думаю лучше все-таки пересмотреть рел. модель Базы, а не мучиться с "хромой".
PEAKTOP (2009-07-22 11:12:00) [14]> Мне нужно исключить появление повторных записей-дублей в
> таблице2 при повторном нажатии пользоателей на кнопочку
> формирования записей в таблице2. Вот и вопрос: как исключить
> эти записи-дубли именно в этом случае?
ALTER TABLE"таблица2"
ADD CONSTRAINT"CUNQ_таблица2_NO_DUPL" ("Date1", "MEN1") USING INDEX"INDX_таблица2_NO_DUPL";
ну и EXCEPTION отлавливать на клиенте, соответственно.
Сергей М. (2009-07-22 10:02:00) [15]
> как построить условие для исключения?
Выясни это сама:
try
.. попытка добавления записи ..
except
on e: Exception do ShowMessage(e.Classname + ' ' + e.message);
end;
Mery (2009-07-22 09:38:00) [16]как конкретно try..except/finally использовать в моём случае?
в try добавить запись в таблицу, а как построить условие для исключения?
Виталий Панасенко (2009-07-22 09:11:00) [17]а помощь почитать слабо? о try..except/finally не слышали ничего? стандартная конструкция Object Pascal..ой, изывиняюсь! уже ж Delphi!
turbouser (2009-07-22 08:27:00) [18]
> Mery (22.07.09 06:40) [5]
> ОЧЕНЬ надеюсь на РЕАЛЬНУЮ помощь
Больше можешь не надеяться.
Mery (2009-07-22 06:40:00) [19]как всегда все ТАКИЕ УМНЫЕ, так и блещут своей мудростью, не более того...
В моём случае есть таблица1 с датами (поле Date1), привязанными к клиенту (поле MEN1). И есть таблица2, в которую автоматически (при нажатии пользователем на кнопку) вставляются записи с таким же полем с кодом клиента и с датой=Таблица1.Date1+30. Мне нужно исключить появление повторных записей-дублей в таблице2 при повторном нажатии пользоателей на кнопочку формирования записей в таблице2. Вот и вопрос: как исключить эти записи-дубли именно в этом случае? ОЧЕНЬ надеюсь на РЕАЛЬНУЮ помощь. А вот это оставь СОВЕСТЬ ДМ при себе, будь любезен.
<или как обычно - ничего не знаю, но пишу суперпрограммы?
СовестьДМ (2009-07-21 19:49:00) [20]+
О проектировании знаем ?
О системах знаем ?
или как обычно - ничего не знаю, но пишу суперпрограммы?