Как удалить из пользовательской базы данных дубликаты записей с идентификатором 221 - PullRequest
1 голос
/ 03 мая 2019

У меня есть следующая хранимая процедура:

ALTER PROCEDURE [dbo].[sp_ImportSurveys] 
  @surveys udtSurveys readonly
AS
BEGIN
    INSERT INTO Surveys
        (Funzione,
         Id_Intervento,
         Titolo_Intervento,
         Titolo_Rilievo,
         ImportDownloadDate,
         Oggetto_Valutato,
         Id_Oggetto_Valutato,
         Id,
         Id_Banca,
         Cod_ABI,
         Legal_Entity,
         Title,
         Descrizione_Rilievo,
         Azione_di_Mitigazione,
         Owner_Azione_di_Mitigazione,
         Utente_Censimento,
         Severita_Rilievo,
         Data_Scadenza,
         Anno,
         StatusId)
    SELECT Funzione, 
        Id_Intervento,
        Titolo_Intervento,
        Titolo_Rilievo, 
        DataDownload,
        Oggetto_Valutato,
        Id_Oggetto_Valutato,
        CONVERT(nvarchar(450), Id) + Funzione,
        Id_Banca,
        Cod_ABI,
        Legal_Entity,
        Titolo_Rilievo,
        Descrizione_Rilievo,
        Azione_di_Mitigazione,
        Owner_Azione_di_Mitigazione,
        Utente_Censimento,
        Severita_Rilievo,
        Data_Scadenza,
        Anno,
        2 
    FROM @surveys sur
    WHERE NOT EXISTS (Select * from dbo.Surveys WHERE  dbo.Surveys.Id = (CONVERT(nvarchar(450), sur.Id) + Funzione))
END

udtSurveys используется как параметры в виде хранимой процедуры.

Перед вставкой записей в таблицу surveys Мне нужно удалить все дубликаты столбца с Id из udtSurveys.

Не могли бы вы показать мне пример использования group by или другого способа удалениядублирующиеся записи перед вставкой в ​​таблицу?

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

Вы можете просто использовать CTE для фильтрации всех дублирующихся строк из параметра @surveys.

Я обновил ваш запрос с cte_tbl, предполагая, что вы хотите сохранить исходные строки и удалить их дубликаты.

ALTER PROCEDURE [dbo].[sp_ImportSurveys] 
  @surveys udtSurveys readonly
AS
BEGIN

    ;WITH cte_tbl AS (
        SELECT  *,
                RN = ROW_NUMBER() OVER(PARTITION BY Id ORDER BY Funzione) 
        FROM @surveys sur
        WHERE NOT EXISTS (  SELECT 1
                            FROM dbo.Surveys
                            WHERE dbo.Surveys.Id = (CONVERT(nvarchar(450), sur.Id) + Funzione))
    )

    INSERT INTO Surveys
        (Funzione,
         Id_Intervento,
         Titolo_Intervento,
         Titolo_Rilievo,
         ImportDownloadDate,
         Oggetto_Valutato,
         Id_Oggetto_Valutato,
         Id,
         Id_Banca,
         Cod_ABI,
         Legal_Entity,
         Title,
         Descrizione_Rilievo,
         Azione_di_Mitigazione,
         Owner_Azione_di_Mitigazione,
         Utente_Censimento,
         Severita_Rilievo,
         Data_Scadenza,
         Anno,
         StatusId)
    SELECT Funzione, 
        Id_Intervento,
        Titolo_Intervento,
        Titolo_Rilievo, 
        DataDownload,
        Oggetto_Valutato,
        Id_Oggetto_Valutato,
        CONVERT(nvarchar(450), Id) + Funzione,
        Id_Banca,
        Cod_ABI,
        Legal_Entity,
        Titolo_Rilievo,
        Descrizione_Rilievo,
        Azione_di_Mitigazione,
        Owner_Azione_di_Mitigazione,
        Utente_Censimento,
        Severita_Rilievo,
        Data_Scadenza,
        Anno,
        2 
    FROM cte_tbl 
    WHERE RN = 1 -- will only fetch the distinct id-rows
END
1 голос
/ 03 мая 2019

Одним из способов является вложение запроса, который получает дубликат записи, как.Затем внутренняя функция select получает идентификатор, если существует более 1 записи.

declare @id varchar = 'ABC'
delete from [dbo].[TABLE_NAME]
where id in (Select id from [TABLE_NAME]
              where [id] = @id
              group by id
              having count(*) > 1
             )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...