Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL (от Сани Сафронова).doc
Скачиваний:
71
Добавлен:
03.06.2015
Размер:
969.22 Кб
Скачать

Обновление таблицы t_details

Запрос

SELECT id_pk, name, color

, RANK() OVER(PARTITION BY name, color ORDER BY name, color, id_pk) dup

,(SELECT MIN(id) FROM T_pk WHERE T_pk.name = X.name) min_id

FROM T_pk X JOIN T_details ON id=id_pk;

определяет наличие дубликатов (значение dup > 1) и минимальное значение id в группе одинаковых имен (min_id). Вот результат выполнения этого запроса:

Id_pk name color dup min_id

1 John blue 1 1

1 John red 1 1

3 John red 2 1

4 Smith blue 1 2

2 Smith green 1 2

2 Smith red 1 2

6 Tom red 1 6

Теперь нам нужно заменить значение id_pk значением min_pk для всех строк, кроме третьей, т.к. эта строка есть дубликат второй строки, о чем говорит значение dup=2. Запрос на обновление можно написать так:

UPDATE T_details

SET id_pk=min_id

FROM T_details T_d JOIN (

SELECT id_pk, name, color

, RANK() OVER(PARTITION BY name, color ORDER BY name, color, id_pk) dup

,(SELECT MIN(id) FROM T_pk WHERE T_pk.name = X.name) min_id

FROM T_pk X JOIN T_details ON id=id_pk

) Y ON Y.id_pk=T_d.id_pk

WHERE dup =1;

После обновления таблица T_details примет следующий вид:

Id_pk color

1 blue

1 red

2 blue

2 green

2 red

3 red

6 red

Как видно, осталась одна лишняя дубликатная строка:

3 red

Но о ней можно не беспокоиться, так она будет удалена автоматически при каскадном удалении дубликатов из таблицы T_pk:

DELETE

FROM T_pk

WHERE id > (SELECT MIN(id) FROM T_pk X WHERE X.name = T_pk.name);

Последний запрос и является вторым этапом процедуры, в результате выполнения которого мы получим:

Таблица T_pk

Id name

1 John

2 Smith

6 Tom

Таблица T_details

Id_pk color

1 blue

1 red

2 blue

2 green

2 red

6 red

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

ALTER TABLE T_pk

ADD CONSTRAINT unique_name UNIQUE(name);

Dzone.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]