如何从用户数据库中删除ID为221的重复记录

时间:2019-05-03 01:51:04

标签: sql sql-server tsql

我有以下存储过程:

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

udtSu​​rveys与存储过程的参数一样使用。

在将记录插入表surveys之前,我需要从udtSu​​rveys中删除所有带有ID的重复列。

请问给我一个例子,说明如何在插入表之前使用group by或另一种方式删除重复的记录吗?

2 个答案:

答案 0 :(得分:2)

您只需使用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 :(得分:1)

一种方法是嵌套获取类似重复记录的查询。如果记录多于1条,则内部选择会获取ID。

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
             )