Пожалуйста, объясните четко запрос CTE? - PullRequest
0 голосов
/ 21 сентября 2018

Я видел

WITH tblTemp as
(
   SELECT ROW_NUMBER() Over(PARTITION BY Name,Department ORDER BY Name) As RowNumber, * 
   FROM <table_name>
)
DELETE FROM tblTemp where RowNumber > 1

Этот запрос для удаления повторяющихся строк, но я не могу понять запрос.Не могли бы вы объяснить четко?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

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

SELECT *
FROM tblTemp
ORDER BY Department, Name;

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

Name          | Department | RowNumber
Jon Skeet     | Software   | 1
Gordon Linoff | Database   | 1
Gordon Linoff | Database   | 2

Запись (Gordon Linoff, Database) отображается в двух экземплярах, поэтому во второй записи есть номер номера строки, который больше 1. Ваша логика удаления удалит этот дубликат, но не повлияет на запись (Jon Skeet, Software), которая имеетбез дубликатов.

0 голосов
/ 21 сентября 2018

common table expression находит дублирующиеся строки, затем следующий запрос на удаление удаляет все, кроме одной строки, если есть дубликаты.

SELECT
   ROW_NUMBER() Over(PARTITION BY Name,Department ORDER BY Name) As RowNumber
   ,* 
FROM <table_name>

В предложении over() partition и order by определяет, где нумерация начинается с 1, затем в каждом partition каждая дополнительная строка получает больший номер строки.Следовательно, когда [RowNumber] = 1 у вас есть уникальный набор строк для имени и отдела.

см.: Over () и row_number ()

Демонстрация

CREATE TABLE mytable(
   name       VARCHAR(6) NOT NULL
  ,department VARCHAR(11) NOT NULL
);
INSERT INTO mytable(name,department) VALUES ('fred','sales');
INSERT INTO mytable(name,department) VALUES ('fred','sales');
INSERT INTO mytable(name,department) VALUES ('barney','admin');
INSERT INTO mytable(name,department) VALUES ('barney','admin');
INSERT INTO mytable(name,department) VALUES ('wilma','engineering');



WITH tblTemp as
(
   SELECT ROW_NUMBER() Over(PARTITION BY Name,Department ORDER BY Name) As RowNumber, * 
   FROM mytable
)
DELETE FROM tblTemp where RowNumber > 1
;

select
*
from mytable
;

+---+--------+-------------+
|   |  name  | department  |
+---+--------+-------------+
| 1 | fred   | sales       |
| 2 | barney | admin       |
| 3 | wilma  | engineering |
+---+--------+-------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...