我有以下存储过程:
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
之前,我需要从udtSurveys中删除所有带有ID的重复列。
请问给我一个例子,说明如何在插入表之前使用group by
或另一种方式删除重复的记录吗?
答案 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
)