Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2010.11.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.003 c
4-1241548178
ID_23587A5E
2009-05-05 22:29
2010.11.28
Перемещение окна без перемещения изображения в нем


15-1282205819
eitho
2010-08-19 12:16
2010.11.28
алгоритм генерации линейных уравнений


15-1282225986
ufowOw
2010-08-19 17:53
2010.11.28
Нужна помощь с реализацией игры!!


15-1282027455
trw
2010-08-17 10:44
2010.11.28
как узнать автора файла


2-1284022386
6ruse
2010-09-09 12:53
2010.11.28
вместо ID его значение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский