русс | укр

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

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

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

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


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

Удаление дубликатов из виртуальной таблицы


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


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

DELETE FROM (SELECT name, RANK() OVER (PARTITION BY name ORDER BY num) rnk

FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY name) num

FROM T

) X

WHERE rnk > 1;

т.к. в операторе DELETE допускается использовать только базовую таблицу или представление. Поэтому мы могли бы создать представление и удалить записи уже из него. Конечно, на самом деле записи удаляются из базовой таблицы, на которой создано представление. Итак, мы можем поступить следующим образом:

CREATE VIEW Tview

AS

SELECT name, RANK() OVER (PARTITION BY name ORDER BY num) rnk

FROM(SELECT *, ROW_NUMBER() OVER(ORDER BY name) num

FROM T

) X

GO

DELETE FROM Tview

WHERE rnk > 1;

"Опять что-то создавать", - скажете вы. Не обязательно, и, чтобы доказать это, нам помогут общие табличные выражения (CTE), которые можно назвать виртуальными представлениями. CTE, хотя и не являются сохраняемыми в базе данных объектами, могут использоваться с операторами обновления. В результате все сводится к одному запросу:

WITH CTE AS

(SELECT name, RANK() OVER (PARTITION BY name ORDER BY num) rnk

FROM(SELECT *, ROW_NUMBER() OVER(ORDER BY name) num

FROM T

) X

)

DELETE FROM CTE

WHERE rnk > 1;

GO

Не забудьте только создать первичный ключ. :-)


06-10-2009

Попал по внешней ссылке на эту статью и решил себе возразить. :-)

Вот эта фраза: "Мы не можем сразу ранжировать строки просто потому, что их не по чем ранжировать."

Разумеется, это правильно, но мы можем отказаться от ранжирования (в ущерб обучению :-)), выполнив "псевдоранжирование". Дело в том, что есть возможность выполнить независимую нумерацию для каждой группы, если в предложении OVER для функции ROW_NUMBER использовать конструкцию PARTITION BY. Итак, можно вообще обойтись без функции RANK, если выполнить разбиение по name



SELECT name, ROW_NUMBER() OVER(PARTITION BY name ORDER BY name)

FROM T;

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

WITH CTE AS (

SELECT name, ROW_NUMBER() OVER(PARTITION BY name ORDER BY name) rnk

FROM T

)

DELETE FROM CTE

WHERE rnk > 1;

Dzone.com



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


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


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

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

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


 


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

 
 

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

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