русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2015-07-09; просмотров: 424; Нарушение авторских прав


Запрос

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_id1 John blue 1 11 John red 1 13 John red 2 14 Smith blue 1 22 Smith green 1 22 Smith red 1 26 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 color1 blue1 red2 blue2 green2 red3 red6 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_pkid name 1 John2 Smith6 Tom Таблица T_detailsid_pk color1 blue1 red2 blue2 green2 red6 red

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

ALTER TABLE T_pk

ADD CONSTRAINT unique_name UNIQUE(name);

Dzone.com

 



<== предыдущая лекция | следующая лекция ==>
Как удалить дубликаты строк при наличии первичного ключа? | Содержание


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.631 сек.