Как я могу удалить дубликаты строк в той же таблице, которые имеют идентичные данные CLOB? - PullRequest
0 голосов
/ 15 января 2019

У меня есть таблица в Oracle, одним из столбцов которой (CONTENTSTRING) является CLOB. Однако некоторые строки в этой таблице имеют идентичные данные в этом столбце. То, что я хотел бы сделать, это удалить все строки, кроме одной, которая имеет эти идентичные данные. Как мне это сделать?

Погуглив, я вижу массу примеров для сравнения двух столбцов. Я также вижу примеры сравнения двух разных таблиц. То, что я не вижу, это пример использования одной таблицы и только сравнения строк! Я думаю, что мне может понадобиться использовать эту функцию: dbms_lob.compare. Однако я все еще не уверен, как настроить эту функцию.

С точки зрения программиста, я думаю, может быть, мне следует сделать что-то вроде:

SELECT CONTENTSTRING FROM TABLE_ALPHA A

и затем каким-то образом сделать другой выбор из той же таблицы, что и TABLE_ALPHA B, а затем используйте dmbs_lob.compare для сравнения двух столбцов. Если номера строк различаются И содержимое столбцов одинаково, то строка из TABLE_ALPHA B может быть удалена.

Я думаю, что это правильный подход, но как именно я написал бы это в Oracle, используя SQL? Я был бы признателен за любую помощь или ресурсы по этому вопросу. Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Этот ответ предполагает, что у вас есть поле первичного ключа в исходной таблице (я назвал его id).

Вы можете использовать подзапрос для вывода списка id дублированных записей: это работает путем самостоятельного соединения таблицы с dbms_lob.compare и предложением сравнения в id. Если существуют одинаковые строки с одинаковым содержимым CLOB, выбираются все id s , но самые древние (т.е. самые маленькие). Внешний запрос просто удаляет выбранные id s. NVL будет рассматривать NULL содержимое как дубликаты (если это не относится к вашему варианту использования, просто удалите их).

DELETE FROM TABLE_ALPHA 
WHERE id IN (
    SELECT b.id
    FROM TABLE_ALPHA a
    INNER JOIN TABLE_ALPHA b 
        ON  
        (
            (a.contentString IS NULL AND b.contentString IS NULL) 
            OR dbms_lob.compare(a.CONTENTSTRING, b.CONTENTSTRING) = 0
        ) 
        AND b.id > a.id
);

См. эту скрипку БД .

0 голосов
/ 15 января 2019
DELETE
FROM TABLE_ALPHA A
WHERE EXISTS (
  SELECT 1 FROM TABLE_ALPHA B
  WHERE DBMS_LOB.COMPARE(A.CONTENTSTRING, B.CONTENTSTRING) = 0
  AND A.ROWID > B.ROWID
)

При этом удаляются все дубликаты, кроме первого.

...