SQL Server表中刪除具有重復(fù)主鍵標(biāo)識列的重復(fù)行
廣告:
示例:表名為test,主鍵列為id,另外一列為name
注意:如果使用 insert和select聯(lián)合語句,需要將id列標(biāo)識列臨時去掉。之后要還原。
--插入重復(fù)行到臨時表 SELECT DISTINCT * INTO temp_table FROM test GROUP BY id,name HAVING COUNT(id) > 1 go --如果提示選擇列表中的列 'test.name' 無效,因為該列沒有包含在聚合函數(shù)或 GROUP BY 子句中。則 GROUP BY id 改為GROUP BY id,name go --刪除原表重復(fù)行所有數(shù)據(jù)(重復(fù)兩行都會刪掉) DELETE test WHERE id IN (SELECT id FROM temp_table) go --還原數(shù)據(jù)。如果使用 insert和select聯(lián)合語句,需要將id列標(biāo)識列臨時去掉 INSERT test SELECT * FROM temp_table go --刪除臨時表 DROP TABLE temp_table
多列:
--查詢是否存在重復(fù)的數(shù)據(jù)
dbcc checktable('pos_t_saleflow_pre')
select flow_no, flow_id
from pos_t_saleflow_pre
group by flow_no, flow_id
having count(1) > 1
--刪除表中重復(fù)的數(shù)據(jù)
while exists(select flow_no, flow_id
from pos_t_payflow_pre
group by flow_no, flow_id
having count(1) > 1)
begin
set rowcount 1
delete a
from pos_t_payflow_pre a
inner join (select flow_no, flow_id
from pos_t_payflow_pre
group by flow_no, flow_id
having count(1) > 1) b on a.flow_no = b.flow_no and a.flow_id = b.flow_id
set rowcount 0
end
附加:
手動插入數(shù)據(jù)
SET IDENTITY_INSERT [dbo].[test] ON --如果表有 IDENTITY 列,則在將數(shù)據(jù)還原到原始表時,必須使用 SET IDENTITY_INSERT ON。[dbo].[test]后面加.不是dbo.test
INSERT [dbo].[test] ([id], [name]) VALUES (12, N'454545')
SET IDENTITY_INSERT [dbo].[test] OFF
提示:僅當(dāng)使用了列列表并且 IDENTITY_INSERT 為 ON 時,才能為表'test1'中的標(biāo)識列指定顯式值。
解決:如果使用insert和select聯(lián)合語句,需要將原表id列標(biāo)識列臨時去掉。數(shù)據(jù)還原后再手動設(shè)計還原為標(biāo)識列字段。
廣告: