Конференция "Базы" » удаление повторяющихся записей в таблице [D7, IB6.x]
 
  • Mery (21.07.09 14:07) [0]
    Каким образом удалить из таблицы записи-дубли? Если создаю уникальный индекс, то при атоматическом добавлении записей в эту таблицу выходит сообщение о нарушении индекса. Хочется, чтоб никаких сообщений не выдавалось, а запись не добавлялась.
  • Кщд (21.07.09 14:25) [1]
    >Mery   (21.07.09 14:07)  
    ловите и обрабатывайте исключение
  • PEAKTOP © (21.07.09 15:17) [2]
    > Если создаю уникальный индекс, то при атоматическом добавлении записей в эту таблицу выходит сообщение о нарушении индекса

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

    Об автогенерации первичного ключа знаем ?
    http://firebirdsql.su/doku.php?id=gen_id
  • Anatoly Podgoretsky © (21.07.09 15:23) [3]
    > PEAKTOP  (21.07.2009 15:17:02)  [2]

    Да не должно быть дублей в нормально спроектированой системе.
  • СовестьДМ © (21.07.09 19:49) [4]
    +
    О проектировании знаем ?
    О системах знаем ?

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

    > Mery   (22.07.09 06:40) [5]


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

    Больше можешь не надеяться.
  • Виталий Панасенко (22.07.09 09:11) [7]
    а помощь почитать слабо? о try..except/finally не слышали ничего? стандартная конструкция Object Pascal..ой, изывиняюсь! уже ж Delphi!
  • Mery (22.07.09 09:38) [8]
    как конкретно try..except/finally использовать в моём случае?
    в try добавить запись в таблицу, а как построить условие для исключения?
  • Сергей М. © (22.07.09 10:02) [9]

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


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

    try
    .. попытка добавления записи ..
    except
     on e: Exception do ShowMessage(e.Classname + ' ' + e.message);
    end;
  • PEAKTOP © (22.07.09 11:12) [10]
    > Мне нужно исключить появление повторных записей-дублей в
    > таблице2 при повторном нажатии пользоателей на кнопочку
    > формирования записей в таблице2. Вот и вопрос: как исключить
    > эти записи-дубли именно в этом случае?



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


    ну и EXCEPTION отлавливать на клиенте, соответственно.
  • HandBrake (22.07.09 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___ (22.07.09 13:15) [12]

    > HandBrake  


    >
    not in (select distinct



    NOT EXISTS(...

    тогда уж...
  • Кщд (22.07.09 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 (22.07.09 14:36) [14]
    Пообедал. Добрый:).

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

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

    Если Да, приведете код такого SELECTа, буду признателен, а то я чего то  торможу.
  • PEAKTOP © (22.07.09 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___ (22.07.09 15:27) [16]
    :)
  • HandBrake (22.07.09 15:33) [17]
    To PEAKTOP ©
    Спасибо, реально тормознул:)
  • HandBrake (22.07.09 20:54) [18]
    To turbouser___   (22.07.09 15:27) [16]
    Спасибо!
    Читать мне не перечитать основы SQL. Даже стыдно...
    Ладно, зато Урок.
  • Mery (23.07.09 08:18) [19]
    Спасибо за ответ.
    При вызове процедуры из приложения возникает ошибка: при выполненнии insert в таблицу автоматически не генерируется первичный ключ этой таблицы, хотя генератор задан.
  • если б еще эти самые генераторы научиться использовать...:-) www.ibase.ru, точнее http://ibase.ru/devinfo/generator.htm
  • Mery (23.07.09 08:42) [21]
    >Виталий Панасенко(дом)   (23.07.09 08:31) [20]
    вопрос как их использовать, если вызвана вставка в таблицу из процедуры
  • Mery (23.07.09 08:44) [22]
    >Виталий Панасенко(дом)   (23.07.09 08:31) [20]
    за ссылку спасибо. просто ни разу не использовала процедуры. нужно будет поучиться, согласна.
  • makz (24.07.09 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
    )
 
Конференция "Базы" » удаление повторяющихся записей в таблице [D7, IB6.x]
Есть новые Нет новых   [134474   +34][b:0][p:0.002]