Удалить дубликаты ролей для сервера SQL - PullRequest
0 голосов
/ 11 декабря 2018

Я искал коды, но не смог заставить работать коды на моем SQL-сервере 2017.

Мне нужно создать хранимую процедуру, чтобы избежать дублирования данных из таблицы и удалить все дублированные данные.

Я создал этот код:

CREATE PROCEDURE deldupl_LSBU_Staff AS
SELECT Phone_number, COUNT(*) as CNT
FROM LSBU_Staff
GROUP BY Phone_number
DELETE FROM LSBU_Staff  
WHERE Phone_number > 1;

НО, когда я выполняю свой код, он удаляет все записи из таблицы, и я не хочу этого.Я просто хочу удалить все дублированные данные.

Я также создал другой код для удаления дублированных данных из таблицы LSBU_Staff:

SELECT ROW_NUMBER() OVER(PARTITION BY Phone_number ORDER BY Phone_number)
    AS del_dupl_record
    FROM LSBU_Staff
    WHERE Phone_number > 1
    DELETE FROM LSBU_Staff
    WHERE  Phone_number > 1;

И все равно удаляются все данные.

LSBU_Staff столбцы: Staff_id, LastName, FirstName, Speciality_type и Phone_number.Я выбрал Phone_number в качестве его идентификации.

1 Ответ

0 голосов
/ 11 декабря 2018

Попробуй это.Не супер элегантный и может быть убран, но должен сделать свое дело.Это останется первым в группе.Если вы предпочитаете оставить последнее изменение в «l2.Staff_id> l1.Staff_id»

-

DROP TABLE IF EXISTS LSBU_Staff

CREATE TABLE LSBU_Staff
( Staff_id          INT IDENTITY(1,1)
, LastName          VARCHAR(32)
, FirstName         VARCHAR(32)
, Speciality_type   VARCHAR(32)
, Phone_number      VARCHAR(32)
)

INSERT INTO LSBU_Staff (LastName, FirstName, Speciality_type, Phone_number)
VALUES
  ('Stilskin', 'Rumple', 'dancer'   , '305-305-3050')
, ('Lamb', 'Mary', 'shepherd'       , '305-123-4567')
, ('Lamb', 'Aurthur', 'shepherd'    , '305-123-4567')
, ('Fenokee', 'Okee', 'swimmer'     , '305-305-3051')

SELECT * FROM LSBU_Staff

DELETE LSBU_Staff 
WHERE Staff_id IN  
(
    SELECT Staff_id 
    FROM LSBU_Staff l1 
    WHERE EXISTS (SELECT 1 FROM LSBU_Staff l2 WHERE l2.Phone_number = l1.Phone_number 
                                                AND l2.Staff_id < l1.Staff_id)
)

SELECT * FROM LSBU_Staff

DROP TABLE IF EXISTS LSBU_Staff
...