以下就重复记录删除的问题作一阐述。 有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。 1、对于第一种重复,比较容易解决,使用 select distinct * from tableName 就可以得到无重复记录的结果集。 如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除 select distinct * into #Tmp from tableName drop table tableName select * into tableName from #Tmp drop table #Tmp 发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下 假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集 select identity(int,1,1) as autoID, * into #Tmp from tableName select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID select * from #Tmp where autoID in(select autoID from #tmp2) 最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
--示例数据库 IF EXISTS(SELECT name FROM sysobjects WHERE name = N'T_SOURCE' AND type = 'U') DROP TABLE T_SOURCE GOCREATE TABLE T_SOURCE( COL1 VARCHAR(20), COL2 VARCHAR(20), COL3 INT ) GO IF EXISTS(SELECT name FROM sysobjects WHERE name = N'T_TEMP' AND type = 'U') DROP TABLE T_TEMP GOCREATE TABLE T_TEMP( COL1 VARCHAR(20), COL2 VARCHAR(20), COL3 INT ) GOIF EXISTS(SELECT name FROM sysobjects WHERE name = N'T_DESTINATION' AND type = 'U') DROP TABLE T_DESTINATION GOCREATE TABLE T_DESTINATION( [ID] INT NOT NULL IDENTITY (1, 1), COL1 VARCHAR(20), COL2 VARCHAR(20), COL3 INT ) GO ALTER TABLE T_DESTINATION ADD CONSTRAINT PK_T_DESTINATION PRIMARY KEY CLUSTERED ( [ID] ) IF EXISTS(SELECT name FROM sysobjects WHERE name = N'T_FORCOL1' AND type = 'U') DROP TABLE T_FORCOL1 GOCREATE TABLE T_FORCOL1( FORCOL1 VARCHAR(20) ) GO IF EXISTS(SELECT name FROM sysobjects WHERE name = N'T_FORCOL2' AND type = 'U') DROP TABLE T_FORCOL2 GOCREATE TABLE T_FORCOL2( FORCOL2 VARCHAR(20) ) GOIF EXISTS(SELECT name FROM sysobjects WHERE name = N'T_CROSS_COL' AND type = 'U') DROP TABLE T_CROSS_COL GOCREATE TABLE T_CROSS_COL( FORCOL1 VARCHAR(20) ,FORCOL2 VARCHAR(20) ) GO------------------------------------------------------ INSERT T_SOURCE VALUES('A',1,1) INSERT T_SOURCE VALUES('A',1,1) INSERT T_SOURCE VALUES('A',2,1) INSERT T_SOURCE VALUES('B',1,1) INSERT T_SOURCE VALUES('B',1,1) INSERT T_SOURCE VALUES('B',1,1) INSERT T_SOURCE VALUES('B',2,1) INSERT T_SOURCE VALUES('B',2,2)-------------------------------------------------以上是基础数据INSERT INTO T_FORCOL1 SELECT DISTINCT COL1 FROM T_SOURCE INSERT INTO T_FORCOL2 SELECT DISTINCT COL2 FROM T_SOURCEINSERT INTO T_CROSS_COL SELECT A.FORCOL1,B.FORCOL2 FROM T_FORCOL1 A CROSS JOIN T_FORCOL2 B INSERT INTO T_TEMP SELECT DISTINCT COL1 ,COL2 ,COL3 FROM T_SOURCEINSERT INTO T_DESTINATION (COL1,COL2,COL3) SELECT DISTINCT A.COL1 ,A.COL2 ,SUM (A.COL3) FROM T_TEMP A INNER JOIN T_CROSS_COL B ON(A.COL1 = B.FORCOL1 AND A.COL2 = B.FORCOL2) GROUP BY A.COL1,A.COL2
实际上用group by就可以了,Select 名称,型号,sum(数量) into 新表名 From 表 Group by 名称,型号。
例如下例可去重复记录: begin tran select * into #TempTable from 表delete 表insert into 表(名称,型号,数量) select distinct 名称,型号,数量 from #TempTablesdrop table #TempTable commit tran
如果表已经导入,再增加主键:alter table 表名 add 列名 int identity(1,1)或通过企业管理器完成。
http://www.enet.com.cn/esafe/inforcenter/A20041022354989.html
1、对于第一种重复,比较容易解决,使用
select distinct * from tableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
IF EXISTS(SELECT name
FROM sysobjects
WHERE name = N'T_SOURCE'
AND type = 'U')
DROP TABLE T_SOURCE
GOCREATE TABLE T_SOURCE(
COL1 VARCHAR(20),
COL2 VARCHAR(20),
COL3 INT
)
GO
IF EXISTS(SELECT name
FROM sysobjects
WHERE name = N'T_TEMP'
AND type = 'U')
DROP TABLE T_TEMP
GOCREATE TABLE T_TEMP(
COL1 VARCHAR(20),
COL2 VARCHAR(20),
COL3 INT
)
GOIF EXISTS(SELECT name
FROM sysobjects
WHERE name = N'T_DESTINATION'
AND type = 'U')
DROP TABLE T_DESTINATION
GOCREATE TABLE T_DESTINATION(
[ID] INT NOT NULL IDENTITY (1, 1),
COL1 VARCHAR(20),
COL2 VARCHAR(20),
COL3 INT
)
GO
ALTER TABLE T_DESTINATION ADD CONSTRAINT
PK_T_DESTINATION PRIMARY KEY CLUSTERED
(
[ID]
)
IF EXISTS(SELECT name
FROM sysobjects
WHERE name = N'T_FORCOL1'
AND type = 'U')
DROP TABLE T_FORCOL1
GOCREATE TABLE T_FORCOL1(
FORCOL1 VARCHAR(20)
)
GO
IF EXISTS(SELECT name
FROM sysobjects
WHERE name = N'T_FORCOL2'
AND type = 'U')
DROP TABLE T_FORCOL2
GOCREATE TABLE T_FORCOL2(
FORCOL2 VARCHAR(20)
)
GOIF EXISTS(SELECT name
FROM sysobjects
WHERE name = N'T_CROSS_COL'
AND type = 'U')
DROP TABLE T_CROSS_COL
GOCREATE TABLE T_CROSS_COL(
FORCOL1 VARCHAR(20)
,FORCOL2 VARCHAR(20)
)
GO------------------------------------------------------
INSERT T_SOURCE VALUES('A',1,1)
INSERT T_SOURCE VALUES('A',1,1)
INSERT T_SOURCE VALUES('A',2,1)
INSERT T_SOURCE VALUES('B',1,1)
INSERT T_SOURCE VALUES('B',1,1)
INSERT T_SOURCE VALUES('B',1,1)
INSERT T_SOURCE VALUES('B',2,1)
INSERT T_SOURCE VALUES('B',2,2)-------------------------------------------------以上是基础数据INSERT INTO T_FORCOL1
SELECT DISTINCT
COL1
FROM T_SOURCE
INSERT INTO T_FORCOL2
SELECT DISTINCT
COL2
FROM T_SOURCEINSERT INTO T_CROSS_COL
SELECT A.FORCOL1,B.FORCOL2
FROM T_FORCOL1 A
CROSS JOIN T_FORCOL2 B
INSERT INTO T_TEMP
SELECT DISTINCT
COL1
,COL2
,COL3
FROM T_SOURCEINSERT INTO T_DESTINATION (COL1,COL2,COL3)
SELECT DISTINCT
A.COL1
,A.COL2
,SUM (A.COL3)
FROM T_TEMP A
INNER JOIN T_CROSS_COL B ON(A.COL1 = B.FORCOL1 AND A.COL2 = B.FORCOL2)
GROUP BY A.COL1,A.COL2
begin tran
select *
into #TempTable
from 表delete 表insert into 表(名称,型号,数量)
select distinct 名称,型号,数量 from #TempTablesdrop table #TempTable
commit tran
add 列名 int identity(1,1)或通过企业管理器完成。