Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.28;
Скачать: CL | DM;

Вниз

удаление повторяющихся записей в таблице   Найти похожие ветки 

 
Mery   (2009-07-21 14:07) [0]

Каким образом удалить из таблицы записи-дубли? Если создаю уникальный индекс, то при атоматическом добавлении записей в эту таблицу выходит сообщение о нарушении индекса. Хочется, чтоб никаких сообщений не выдавалось, а запись не добавлялась.


 
Кщд   (2009-07-21 14:25) [1]

>Mery   (21.07.09 14:07)  
ловите и обрабатывайте исключение


 
PEAKTOP ©   (2009-07-21 15:17) [2]

> Если создаю уникальный индекс, то при атоматическом добавлении записей в эту таблицу выходит сообщение о нарушении индекса

О первичных ключах знаем ?
http://firebirdsql.su/doku.php?id=constraint

Об автогенерации первичного ключа знаем ?
http://firebirdsql.su/doku.php?id=gen_id


 
Anatoly Podgoretsky ©   (2009-07-21 15:23) [3]

> PEAKTOP  (21.07.2009 15:17:02)  [2]

Да не должно быть дублей в нормально спроектированой системе.


 
СовестьДМ ©   (2009-07-21 19:49) [4]

+
О проектировании знаем ?
О системах знаем ?

или как обычно - ничего не знаю, но пишу суперпрограммы?


 
Mery   (2009-07-22 06:40) [5]

как всегда все ТАКИЕ УМНЫЕ, так и блещут своей мудростью, не более того...
В моём случае есть таблица1 с датами (поле Date1), привязанными к клиенту (поле MEN1). И есть таблица2, в которую автоматически (при нажатии пользователем на кнопку) вставляются записи с таким же полем с кодом клиента и с датой=Таблица1.Date1+30. Мне нужно исключить появление повторных записей-дублей в таблице2 при повторном нажатии пользоателей на кнопочку формирования записей в таблице2. Вот и вопрос: как исключить эти записи-дубли именно в этом случае? ОЧЕНЬ надеюсь на РЕАЛЬНУЮ помощь. А вот это оставь СОВЕСТЬ ДМ при себе, будь любезен.
<или как обычно - ничего не знаю, но пишу суперпрограммы?


 
turbouser ©   (2009-07-22 08:27) [6]


> Mery   (22.07.09 06:40) [5]


> ОЧЕНЬ надеюсь на РЕАЛЬНУЮ помощь

Больше можешь не надеяться.


 
Виталий Панасенко   (2009-07-22 09:11) [7]

а помощь почитать слабо? о try..except/finally не слышали ничего? стандартная конструкция Object Pascal..ой, изывиняюсь! уже ж Delphi!


 
Mery   (2009-07-22 09:38) [8]

как конкретно try..except/finally использовать в моём случае?
в try добавить запись в таблицу, а как построить условие для исключения?


 
Сергей М. ©   (2009-07-22 10:02) [9]


> как построить условие для исключения?


Выясни это сама:

try
.. попытка добавления записи ..
except
 on e: Exception do ShowMessage(e.Classname + " " + e.message);
end;


 
PEAKTOP ©   (2009-07-22 11:12) [10]

> Мне нужно исключить появление повторных записей-дублей в
> таблице2 при повторном нажатии пользоателей на кнопочку
> формирования записей в таблице2. Вот и вопрос: как исключить
> эти записи-дубли именно в этом случае?



ALTER TABLE "таблица2"
 ADD CONSTRAINT "CUNQ_таблица2_NO_DUPL" ("Date1", "MEN1") USING INDEX "INDX_таблица2_NO_DUPL";

ну и EXCEPTION отлавливать на клиенте, соответственно.


 
HandBrake   (2009-07-22 12:53) [11]

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 идет с перегрузкой, Вы можете вообще не дождаться окончания операции. Думаю лучше все-таки пересмотреть рел. модель Базы, а не мучиться с "хромой".


 
turbouser___   (2009-07-22 13:15) [12]


> HandBrake  


> not in (select distinct

NOT EXISTS(... тогда уж...


 
Кщд   (2009-07-22 13:20) [13]

>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
только потом подходить к базе


 
HandBrake   (2009-07-22 14:36) [14]

Пообедал. Добрый:).

Уважаемый Кщд, я так понял, Вы о "large cost".
Знаю и согласен с Вами: сам и предупредил об этом, хотя, может и объяснил не очень здорово.
К базе не подойду, пока не прочитаю все ссылки о correlated subquery :)

Существует способ вычислить вставляемые строки способом отличным от моего в операторе SELECT?

Если Да, приведете код такого SELECTа, буду признателен, а то я чего то  торможу.


 
PEAKTOP ©   (2009-07-22 15:04) [15]


>  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


 
turbouser___   (2009-07-22 15:27) [16]

:)


 
HandBrake   (2009-07-22 15:33) [17]

To PEAKTOP ©
Спасибо, реально тормознул:)


 
HandBrake   (2009-07-22 20:54) [18]

To turbouser___   (22.07.09 15:27) [16]
Спасибо!
Читать мне не перечитать основы SQL. Даже стыдно...
Ладно, зато Урок.


 
Mery   (2009-07-23 08:18) [19]

Спасибо за ответ.
При вызове процедуры из приложения возникает ошибка: при выполненнии insert в таблицу автоматически не генерируется первичный ключ этой таблицы, хотя генератор задан.


 
Виталий Панасенко(дом)   (2009-07-23 08:31) [20]

если б еще эти самые генераторы научиться использовать...:-) www.ibase.ru, точнее http://ibase.ru/devinfo/generator.htm


 
Mery   (2009-07-23 08:42) [21]

>Виталий Панасенко(дом)   (23.07.09 08:31) [20]
вопрос как их использовать, если вызвана вставка в таблицу из процедуры


 
Mery   (2009-07-23 08:44) [22]

>Виталий Панасенко(дом)   (23.07.09 08:31) [20]
за ссылку спасибо. просто ни разу не использовала процедуры. нужно будет поучиться, согласна.


 
makz   (2009-07-24 13:34) [23]

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
)



Страницы: 1 вся ветка

Текущий архив: 2010.11.28;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.009 c
2-1283772860
Alexandr
2010-09-06 15:34
2010.11.28
Извлечение информации из файла Word


15-1282249788
Юрий
2010-08-20 00:29
2010.11.28
С днем рождения ! 20 августа 2010 пятница


15-1282342827
Rouse_
2010-08-21 02:20
2010.11.28
Ega23 - это залет номер два :)


2-1283434549
worldmen
2010-09-02 17:35
2010.11.28
Показ видео в клиент-серверном приложении


3-1248200546
Евгений Р.
2009-07-21 22:22
2010.11.28
Параметр в вычисляемом поле