Скрипт SQL / PLSQL для преобразования значений в таблице базы данных в уникальные - PullRequest
0 голосов
/ 03 октября 2019

У меня есть (oracle) таблица базы данных со столбцом с именем name VARCHAR. Мне нужно обновить таблицу, чтобы добавить уникальное ограничение на этот столбец. Но прежде чем я смогу добавить уникальное ограничение, мне нужно убедиться, что все значения в столбце уникальны. Я хочу добиться этого путем добавления суффиксов, таких как -1, -2 и т. Д. В случае дублирования записей.

Например, если в столбце имени есть 3 строки, имеющие повторяющиеся значения, скажем, значениеHari, я хочу изменить значения на Hari, Hari-1, Hari-2.

Как этого добиться только с использованием SQL / PLSQL?

Ответы [ 3 ]

1 голос
/ 03 октября 2019

Вы можете использовать оператор MERGE и аналитическую функцию ROW_NUMBER():

MERGE INTO table_name dst
USING (
  SELECT ROWID AS rid,
         name,
         ROW_NUMBER() OVER ( PARTITION BY name ORDER BY ROWNUM ) AS rn
  FROM   table_name
) src
ON ( dst.ROWID = src.rid )
WHEN MATCHED THEN
  UPDATE SET name = CASE rn
                    WHEN 1
                    THEN src.name
                    ELSE src.name || '-' || (rn - 1)
                    END;

Затем использовать:

ALTER TABLE table_name ADD CONSTRAINT table_name__name__u UNIQUE( name );

Чтобы создать именованное уникальное ограничение для столбца.

Установка Oracle :

CREATE TABLE table_name ( name ) AS
  SELECT 'Hari'    FROM DUAL UNION ALL
  SELECT 'Hari'    FROM DUAL UNION ALL
  SELECT 'Hari'    FROM DUAL UNION ALL
  SELECT 'Alice'   FROM DUAL UNION ALL
  SELECT 'Bob'     FROM DUAL UNION ALL
  SELECT 'Bob'     FROM DUAL UNION ALL
  SELECT 'Charlie' FROM DUAL;

Вывод :

SELECT * FROM table_name;
| NAME    |
| :------ |
| Hari    |
| Hari-1  |
| Hari-2  |
| Alice   |
| Bob     |
| Bob-1   |
| Charlie |

дБ <> скрипка здесь

1 голос
/ 03 октября 2019

Я использовал пример, который @Tim Biegeleisen предоставил и скорректировал свой ответ, чтобы получить результат, о котором вы просите.

SELECT
    name,
    TO_CHAR(name ||
    case 
        when ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) = 1 then ''
        else to_char ('-' ||  (ROW_NUMBER() OVER (PARTITION BY name ORDER BY id)-1)) 
    end) name_new
FROM yourTable
ORDER BY name;

Демонстрация: https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=8d8a1b3f5146b018f92a4c344ed40414

1 голос
/ 03 октября 2019

Я предлагаю просто использовать ROW_NUMBER() здесь для генерации желаемого идентификатора:

SELECT
    name,
    TO_CHAR(name || '-' || ROW_NUMBER() OVER (PARTITION BY name ORDER BY id)) AS name_new
FROM yourTable
ORDER BY name;

Демо

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