Как удалить дубликаты на основе составного ключа без использования слияния - PullRequest
0 голосов
/ 30 октября 2018

Таким образом, в настоящее время у меня есть проблема, когда я сталкиваюсь с дубликатами, основанными на составном ключе , при попытке вставить в таблицу из материализованного представления. составной ключ состоит из трех столбцов: TIMESTAMP, NAME и TYPE . Я попытался использовать следующий метод, но я все еще сталкиваюсь с той же проблемой (я получаю двойное сообщение об ошибке, и хранимая процедура останавливается). Есть ли способ обработать исключение, чтобы оно просто пропускало дублирующую строку? Если нет, то я подумал о приведенном ниже операторе DELETE, чтобы избавиться от дубликатов, это правильный подход?

Ниже приведено выражение «массовая вставка», которое я использую:

DELETE FROM table
     where timestamp IN (SELECT DISTINCT ts from mv_1)
       and person IN (SELECT distinct name from mv_1)
       and TYPE IN (SELECT distinct data_type from mv_1);
       commit;
--
 DELETE FROM table
     WHERE    timestamp || person || TYPE IN
              (SELECT DISTINCT
                         ts
                      || name
                      || data_type
                 FROM edb.mv_1); 
COMMIT;
--
INSERT INTO table
           (person
            timestamp,
            TYPE)
  SELECT name,
         ts,
         data_type
    FROM edb.mv_1 a
   WHERE  a.row_id NOT IN
                (SELECT row_id
                   FROM (SELECT v.*,
                                ROW_NUMBER ()
                                OVER (
                                   PARTITION BY v.name,
                                                v.data_type,
                                                v.ts
                                   ORDER BY row_id)
                                   AS rn
                           FROM mv_1 v) t
                  WHERE rn > 1)

Примечание: row_id - это столбец, который я создал в MV_1, просто чтобы у меня был столбец, который дал бы мне уникальный идентификатор.

Заранее спасибо!

1 Ответ

0 голосов
/ 30 октября 2018

Я бы сделал таблицу безопасной, добавив составной первичный ключ (который вы уже сделали):

ALTER TABLE table ADD CONSTRAINT pk_table PRIMARY KEY (timestamp, person, type);

Кроме того, я бы сделал материализованный вид безопасным, добавив туда и первичный ключ. В зависимости от того, как построен mv, вам нужно изменить запрос, который его передает, чтобы не было дубликатов. Например, здесь .

Если оба безопасны, вставка проста:

INSERT INTO table (timestamp, person, type, further_col1, col2, ...)
SELECT timestamp, name, type, further_col1, col2, ....
  FROM edb.mv_1 m
 WHERE NOT EXISTS (
       SELECT * 
         FROM table t2 
        WHERE t2.timestamp = m.timestamp
          AND t2.person    = m.name
          AND t2.type      = m.type
       );

Если у вас есть только три столбца, вы можете сократить вставку до:

INSERT INTO table (timestamp, person, type)
SELECT timestamp, name  , type FROM edb.mv_1  
MINUS
SELECT timestamp, person, type FROM table;  

Пожалуйста, убедитесь, что столбцы НЕ являются НЕДЕЙСТВИТЕЛЬНЫМИ в таблице и mv. И, пожалуйста, не называйте таблицы table и столбцы timestamp или type. Я уверен, что это только примеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...