mssql union 重复时间上重复了怎么取一条

2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。sql删除重复数据的详细方法_模板无忧www.mb5u.com
sql删除重复数据的详细方法_Mssql数据库教程
推荐:本篇文章介绍了安装SQL Server 2000各版本的软硬件配置要求,企业版安装过程的详细步骤,以及需要注意的事项。其他版本可以参考安装一. 删除完全重复的记录
完全重复的数据,通常是由于没有设置主键/唯一键约束导致的。测试数据:复制 代码如下:www.mb5u.comif OBJECT_ID('duplicate_all') is not nulldrop table duplicate_all GO create table duplicate_all ( c1 int, c2 int, c3 varchar(100) ) GO insert into duplicate_all select 1,100,'aaa' union allselect 1,100,'aaa' union allselect 1,100,'aaa' union allselect 1,100,'aaa' union allselect 1,100,'aaa' union allselect 2,200,'bbb' union allselect 3,300,'ccc' union allselect 4,400,'ddd' union allselect 5,500,'eee'GO
(1) 借助临时表
利用DISTINCT得到单条记录,删除源数据,然后导回不重复记录。如果表不大的话,可以把所有记录导出一次,然后truncate表后再导回,这样可以避免delete的日志操作。复制代码 代码如下:www.mb5u.comif OBJECT_ID('tempdb..#tmp') is not nulldrop table #tmp GO select distinct * into #tmp from duplicate_all where c1 = 1 GO delete duplicate_all where c1 = 1 GO insert into duplicate_all select * from #tmp(2) 使用ROW_NUMBER复制代码 代码如下:www.mb5u.comwith tmp as( select *,ROW_NUMBER() OVER(PARTITION BY c1,c2,c3 ORDER BY(getdate())) as num from duplicate_all where c1 = 1 ) delete tmp where num & 1
如果多个表有完全重复的行,可以考虑通过UNION将多个表联合,插到一个新的同结构的表,SQL Server会帮助去掉表和表之间的重复行。
二. 删除部分重复的记录
部分列重复的数据,通常表上是有主键的,可能是程序逻辑造成了多行数据列值的重复。测试数据:复制代码 代码如下:www.mb5u.comif OBJECT_ID('duplicate_col') is not nulldrop table duplicate_col GO create table duplicate_col ( c1 int imary key, c2 int, c3 varchar(100) ) GO insert into duplicate_col select 1,100,'aaa' union allselect 2,100,'aaa' union allselect 3,100,'aaa' union allselect 4,100,'aaa' union allselect 5,500,'eee'GO
(1) 唯一索引
唯一索引有个忽略重复建的选项,在创建主键约束/唯一键约束时都可以使用这个索引选项。复制代码 代码如下:www.mb5u.comif OBJECT_ID('tmp') is not nulldrop table tmp GO create table tmp ( c1 int, c2 int, c3 varchar(100), constraint UQ_01 unique(c2,c3) with(IGNORE_DUP_KEY = ON) ) GO insert into tmp select * from duplicate_col select * from tmp(2) 借助主键/唯一键来删除通常会选择主键/唯一键的最大/最小值保留,其他行删除。以下只保留重复记录中c1最小的行。复制代码 代码如下:www.mb5u.comdelete from duplicate_col where exists(select 1 from duplicate_col b where duplicate_col.c1 & b.c1 and (duplicate_col.c2 = b.c2 and duplicate_col.c3 = b.c3)) --或者 复制代码 代码如下:www.mb5u.comdelete from duplicate_col where c1 not in (select min(c1) from duplicate_col group by c2,c3)如果要保留重复记录中的第N行,可以参考05.取分组中的某几行。(3) ROW_NUMBER和删除完全重复记录的写法基本一样。复制代码 代码如下:www.mb5u.comwith tmp as( select *,ROW_NUMBER() OVER(PARTITION BY c2,c3 ORDER BY(getdate())) as num from duplicate_col ) delete tmp where num & 1 select * from duplicate_colSQL删除重复数据只保留一条 (下面的代码,很多网友反馈错误,大家多测试)用SQL语句,删除掉重复项只保留一条在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) & 1) 2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录 delete from people where
peopleName in (select peopleName
from people group by peopleName
having count(peopleName) & 1) and
peopleId not in (select min(peopleId) from people group by peopleName
having count(peopleName)&1) 3、查找表中多余的重复记录(多个字段) select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) & 1) 4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录 delete from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) & 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)&1) 5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录 select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) & 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)&1)
6.消除一个字段的左边的第一位:update tableName set [Title]=Right([Title],(len([Title])-1)) where Title like '村%'7.消除一个字段的右边的第一位:update tableName set [Title]=left([Title],(len([Title])-1)) where Title like '%村'8.假删除表中多余的重复记录(多个字段),不包含rowid最小的记录 update vitae set ispass=-1where peopleId in (select peopleId from vitae group by peopleId分享:使用时代互联的海外空间,sql 2008 无限空间大小,开通账户后,使用sql server management studio 2008 连接数据库,可以链接上,但是无法查看自己的数据库,点击数据库后,提示 无法为该请求检索数据 错误916
相关Mssql数据库教程:
编程教程搜索
Mssql数据库教程推荐
猜你也喜欢看这些豆丁微信公众号
君,已阅读到文档的结尾了呢~~
精品:sql server数据库 sqlserver数据库 数据库分页 oracle数据库分页 数据库分页查询 数据库分页代码 数据库中如何分页 数据库分页技术 数据库的分页查询 sql server 分页
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
探讨如何在有着1000万条数据的MSSQLSERVER数据库中实现快速的数据提取和数据分页
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口2014年7月荣获微软MVP称号2013年7月 荣获微软MVP称号2012年7月 荣获微软MVP称号2011年7月 荣获微软MVP称号
2012年2月 总版技术专家分月排行榜第三
2014年7月荣获微软MVP称号2013年7月 荣获微软MVP称号2012年7月 荣获微软MVP称号2011年7月 荣获微软MVP称号
2012年2月 总版技术专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。sql&server时间戳timestamp
在SQL Server中联机丛书是这样说的:
SQL Server timestamp 数据类型与时间和日期无关。SQL Server timestamp
是二进制数字,它表明数据库中数据修改发生的相对顺序。实现 timestamp 数据类型最初是为了支持 SQL Server
恢复算法。每次修改页时,都会使用当前的 @@DBTS 值对其做一次标记,然后 @@DBTS
加1。这样做足以帮助恢复过程确定页修改的相对次序,但是 timestamp 值与时间没有任何关系。
我用口水话解释一下便于理解:
我们知道数字类型有个“标识”属性,设置好“标识种子”、“标识递增量”,每增加一条记录时,这个字段的值就会在最近的一个标识值基础上自动增加,这样我们可以知道哪些记录是先添加的,哪些记录是后添加的,但是我们无法知道哪些记录修改过。timestamp这个类型的字段呢,每增加一条记录时,它会在最近的一个时间戳基础上自动增加,当修改某条记录时,它也会在最近的一个时间戳基础上自动增加,所以我们就知道哪些记录修改过了。
timestamp 这种数据类型表现自动生成的二进制数,确保这些数在数据库中是唯一的。timestamp
一般用作给表行加版本戳的机制。存储大小为 8 字节。
Transact-SQL timestamp 数据类型与在 SQL-92 标准中定义的 timestamp 数据类型不同。SQL-92
timestamp 数据类型等价于 Transact-SQL datetime 数据类型。
Microsoft& SQL Server& 将来的版本可能会修改 Transact-SQL timestamp
数据类型的行为,使它与在标准中定义的行为一致。到那时,当前的 timestamp 数据类型将用 rowversion
数据类型替换。
Microsoft& SQL Server& 2000 引入了 timestamp 数据类型的 rowversion 同义词。在
DDL 语句中尽可能使用 rowversion 而不使用 timestamp。rowversion
受数据类型同义词行为的制约。有关更多信息,请参见数据类型同义词。
在 CREATE TABLE 或 ALTER TABLE 语句中,不必为 timestamp 数据类型提供列名:
CREATE TABLE ExampleTable (PriKey int PRIMARY KEY,
timestamp)如果没有提供列名,SQL Server 将生成 timestamp 的列名。rowversion
数据类型同义词不具有这样的行为。指定 rowversion 时必须提供列名。
一个表只能有一个 timestamp 列。每次插入或更新包含 timestamp 列的行时,timestamp
列中的值均会更新。这一属性使 timestamp 列不适合作为键使用,尤其是不能作为主键使用。对行的任何更新都会更改
值,从而更改键值。如果该列属于主键,那么旧的键值将无效,进而引用该旧值的外键也将不再有效。如果该表在动态游标中引用,则所有更新均会更改游标中行的位置。如果该列属于索引键,则对数据行的所有更新还将导致索引更新。
不可为空的 timestamp 列在语义上等价于 binary(8) 列。可为空的 timestamp 列在语义上等价于
varbinary(8) 列。
Microsoft SQL Server 用两个 4 字节的整数内部存储 datetime 数据类型的值。第一个 4 字节存储
base date(即 1900 年 1 月 1 日)之前或之后的天数。基础日期是系统参考日期。不允许早于 1753 年 1 月 1
日的 datetime 值。另外一个 4 字节存储以午夜后毫秒数所代表的每天的时间。
---------------------------------------------------------------------------------------------------
@@DBTS(SELECT @@DBTS)
为当前数据库返回当前 timestamp 数据类型的值。这一 timestamp 值保证在数据库中是唯一的。
@@DBTS 返回当前数据库最后所使用的时间戳值。当带有 timestamp 列的一行被插入或更新时,会产生一个新的时间戳值。
SQL Server里的TimeStamp是如何使用的?与Binary(8)又是什么关系?
--------------------------------------------------------------------------------
这个问题第1个回答:
e 没用过 顶顶
--------------------------------------------------------------------------------
这个问题第2个回答:
create table xx(id int, timestamp)
insert into xx(id) select 1
select * from xx
--------------------------------------------------------------------------------
这个问题第3个回答:
防止并发用的,可以和bigint相互转化
--------------------------------------------------------------------------------
这个问题第4个回答:
沒關系,是記錄版本用的
--------------------------------------------------------------------------------
这个问题第5个回答:
create table tb_test(id int, ts timestamp)
insert tb_test(id) select 1
union all select 2
union all select 3
union all select 4
select *, nts=cast(ts as bigint) from tb_test
drop table tb_test
--------------------------------------------------------------------------------
这个问题第6个回答:&& 将时间戳转bigint
declare @n bigint
set @N=8001
select cast(@N as timestamp)
--------------------------------------------------------------------------------
这个问题第7个回答:
公开数据库中自动生成的唯一二进制数字的数据类型。timestamp 通常用作给表行加版本戳的机制。 存储大小为 8 个字节。
timestamp 数据类型只是递增的数字,不保留日期或时间。 若要记录日期或时间,请使用 datetime 数据类型。
每个数据库都有一个计数器,当对数据库中包含 timestamp 列的表执行插入或更新操作时,该计数器值就会增加。
该计数器是数据库时间戳。 这可以跟踪数据库内的相对时间,而不是时钟相关联的实际时间。 一个表只能有一个 timestamp 列。
每次修改或插入包含 timestamp 列的行时,就会在 timestamp 列中插入增量数据库时间戳值。 这一属性使
timestamp 列不适合作为键使用,尤其是不能作为主键使用。 对行的任何更新都会更改 timestamp 值,从而更改键值。
如果该列属于主键,那么旧的键值将无效,进而引用该旧值的外键也将不再有效。 如果该表在动态游标中引用,则所有更新均会更改游标中行的位置。
如果该列属于索引键,则对数据行的所有更新还将导致索引更新。
使用某一行中的 timestamp 列可以很容易地确定该行中的任何值自上次读取以后是否发生了更改。
如果对行进行了更改,就会更新该时间戳值。 如果没有对行进行更改,则该时间戳值将与以前读取该行时的时间戳值一致。
若要返回数据库的当前时间戳值,请使用 @@DBTS。
Transact-SQL timestamp 数据类型不同于在 SQL-2003 标准中定义的 timestamp 数据类型。
SQL-2003 timestamp 数据类型等同于 Transact-SQL datetime 数据类型。
rowversion 的数据类型为 timestamp 数据类型的同义词,并具有数据类型同义词的行为。 在 DDL
语句,请尽量使用 rowversion 而不是 timestamp。 有关详细信息,请参阅 数据类型同义词
(Transact-SQL)。
在 CREATE TABLE 或 ALTER TABLE 语句中,不必为 timestamp 数据类型指定列名,例如:
CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp);
如果不指定列名,则 Microsoft SQL Server 2005 数据库引擎将生成 timestamp 列名;但
rowversion 同义词不具有这样的行为。 在使用 rowversion 时,必须指定列名。
在使用其中的 SELECT 列表中具有 timestamp 列的 SELECT INTO 语句时,可能会生成重复的时间戳值。
建议不要以这种方式使用 timestamp。
mysql的时间戳与sqlserver完全不同,后者与时间无关,只是防止并发,而前者可以记录时间
TIMESTAMP(时间戳)详解
TIMESTAMP的变体
1,TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP &
在创建新记录和修改现有记录的时候都对这个数据列刷新
2,TIMESTAMP DEFAULT CURRENT_TIMESTAMP
&在创建新记录的时候把这个
字段设置为当前时间,但以后修改时,不再刷新它
3,TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
&在创建新记录的时候把这个字段设置为0,
以后修改时刷新它 &www.2cto.com &
4,TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss’ ON UPDATE
CURRENT_TIMESTAMP &
在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它
MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认值为当前更新日期
与时间的功能,你可以使用TIMESTAMP列类型下面就详细说明TIMESTAMP列类型
*TIMESTAMP列类型*
TIMESTAMP值可以从1970的某时的开始一直到2037年,精度为一秒,其值作为数字显示。
TIMESTAMP值显示尺寸的格式如下表所示:
+---------------+----------------+
| 列类型    | 显示格式    |
| TIMESTAMP(14) | YYYYMMDDHHMMSS | 
| TIMESTAMP(12) | YYMMDDHHMMSS  |
| TIMESTAMP(10) | YYMMDDHHMM   |
| TIMESTAMP(8) | YYYYMMDD    |
| TIMESTAMP(6) | YYMMDD     |
| TIMESTAMP(4) | YYMM      |
| TIMESTAMP(2) | YY       |
+---------------+----------------+
“完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的显示尺寸
创造最常见的显示尺寸是6、8、12、和14。
你可以在创建表时指定一个任意的显示尺寸,但是定义列长为0或比14大均会被强制定义为列长14。
列长在从1~13范围的奇数值尺寸均被强制为下一个更大的偶数。
定义字段长度   强制字段长度
TIMESTAMP(0) -& TIMESTAMP(14)
TIMESTAMP(15)-& TIMESTAMP(14)
TIMESTAMP(1) -& TIMESTAMP(2)
TIMESTAMP(5) -& TIMESTAMP(6)
所有的TIMESTAMP列都有同样的存储大小,使用被指定的时期时间值的完整精度
(14位)存储合法的值不考虑显示尺寸。不合法的日期,将会被强制为0存储
*这有几个含意: * &www.2cto.com
1、虽然你建表时定义了列TIMESTAMP(8),但在你进行数据插入与更新时TIMESTAMP列
实际上保存了14位的数据(包括年月日时分秒),只不过在你进行查询时MySQL返回给
你的是8位的年月日数据。如果你使用ALTER TABLE拓宽一个狭窄的TIMESTAMP列,
以前被“隐蔽”的信息将被显示。
2、同样,缩小一个TIMESTAMP列不会导致信息失去,除了感觉上值在显示时,
较少的信息被显示出。
3、尽管TIMESTAMP值被存储为完整精度,直接操作存储值的唯一函数是UNIX_TIMESTAMP();
由于MySQL返回TIMESTAMP列的列值是进过格式化后的检索的值,这意味着你可能不能使用某些函数来操作TIMESTAMP列(例如HOUR()或SECOND()),除非TIMESTAMP值的相关部分被包含在格式化的值中。
例如,一个TIMESTAMP列只有被定义为TIMESTAMP(10)以上时,TIMESTAMP列的HH部分才会被显示,
因此在更短的TIMESTAMP值上使用HOUR()会产生一个不可预知的结果。
4、不合法TIMESTAMP值被变换到适当类型的“零”值(00)。(DATETIME,DATE亦然)
*你可以使用下列语句来验证:*
CREATE TABLE test ('id' INT (3) UNSIGNED AUTO_INCREMENT,
TIMESTAMP (8) PRIMARY KEY('id'));
INSERT INTO test SET id = 1;
SELECT * FROM
+----+----------------+
| id | date1     |
+----+----------------+
| 1 |     |
+----+----------------+
ALTER TABLE test CHANGE 'date1' 'date1' TIMESTAMP(14);
SELECT * FROM
+----+----------------+
| id | date1     |
+----+----------------+
| 1 | 23 |
+----+----------------+
你可以使用TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的操作。
如果你有多个TIMESTAMP列,只有第一个自动更新。自动更新第一个TIMESTAMP列在下列任何条件下发生:
1、列值没有明确地在一个INSERT或LOAD DATA INFILE语句中指定。
2、列值没有明确地在一个UPDATE语句中指定且另外一些的列改变值。(注意一个UPDATE
设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为
它当前的值,MySQL为了效率而忽略更改。)
3、你明确地设定TIMESTAMP列为NULL.
4、除第一个以外的TIMESTAMP列也可以设置到当前的日期和时间,只要将列设为NULL,或NOW()。
CREATE TABLE test ( &www.2cto.com
'id' INT (3) UNSIGNED AUTO_INCREMENT,
'date1' TIMESTAMP (14),
'date2' TIMESTAMP (14),
PRIMARY KEY('id')
INSERT INTO test (id, date1, date2) VALUES (1, NULL,
INSERT INTO test SET id= 2;
+----+----------------+----------------+
| id | date1     | date2     |
+----+----------------+----------------+
| 1 | 23 | 23 |
| 2 | 24 | 00 |
+----+----------------+----------------+
-&第一条指令因设date1、date2为NULL,所以date1、date2值均为当前时间第二条指令
因没有设date1、date2列值,第一个TIMESTAMP列date1为更新为当前时间,
而二个TIMESTAMP列date2因日期不合法而变为“00”
UPDATE test SET id= 3 WHERE id=1;
+----+----------------+----------------+
| id | date1     | date2     |
+----+----------------+----------------+
| 3 | 09 | 23 |
| 2 | 24 | 00 |
+----+----------------+----------------+
-&这条指令没有明确地设定date2的列值,所以第一个TIMESTAMP列date1将被更新为当前时间
UPDATE test SET id= 1,date1=date1,date2=NOW() WHERE id=3;
&www.2cto.com &
+----+----------------+----------------+
| id | date1     | date2     |
+----+----------------+----------------+
| 1 | 09 | 20 |
| 2 | 24 | 00 |
+----+----------------+----------------+
-&这条指令因设定date1=date1,所以在更新数据时date1列值并不会发生改变而
因设定date2=NOW(),所以在更新数据时date2列值会被更新为当前时间此指令等效为
UPDATE test SET id= 1,date1=date1,date2=NULL WHERE id=3;
因MySQL返回的 TIMESTAMP 列为数字显示形式,你可以用DATE_FROMAT()函数来格式化 TIMESTAMP
SELECT id,DATE_FORMAT(date1,'%Y-%m-%d %H:%i:%s') As
DATE_FORMAT(date2,'%Y-%m-%d %H:%i:%s') As date2 FROM
+----+---------------------+---------------------+
| id | date1        | date2        |
+----+---------------------+---------------------+
09:40:09 |
09:43:20 |
09:37:24 |
00:00:00 |
+----+---------------------+---------------------+
SELECT id,DATE_FORMAT(date1,'%Y-%m-%d') As date1,
DATE_FORMAT(date2,'%Y-%m-%d') As date2 FROM
& www.2cto.com &
+----+-------------+-------------+
| id | date1    | date2    |
+----+-------------+-------------+
| 1 |  |  |
| 2 |  |  |
+----+-------------+-------------+
在某种程度上,你可以把一种日期类型的值赋给一个不同的日期类型的对象。
然而,而尤其注意的是:值有可能发生一些改变或信息的损失:
1、如果你将一个DATE值赋给一个DATETIME或TIMESTAMP对象,结果值的时间部分被
设置为'00:00:00',因为DATE值中不包含有时间信息。  
2、如果你将一个DATETIME或TIMESTAMP值赋给一个DATE对象,结果值的时间部分被删除,
因为DATE类型不存储时间信息。
3、尽管DATETIME, DATE和TIMESTAMP值全都可以用同样的格式集来指定,
但所有类型不都有同样的值范围。
例如,TIMESTAMP值不能比1970早,也不能比2037晚,这意味着,一个日期例如'',
当作为一个DATETIME或DATE值时它是合法的,但它不是一个正确TIMESTAMP值!
并且如果将这样的一个对象赋值给TIMESTAMP列,它将被变换为0。 &www.2cto.com
*当指定日期值时,当心某些缺陷: *
1、允许作为字符串指定值的宽松格式能被欺骗。例如,,因为“:”分隔符的使用,
值'10:11:12'可能看起来像时间值,但是如果在一个日期中使用,上下文将作为年份被
解释成''。值'10:45:15'将被变换到'',因为'45'不是一个合法的月份。
2、以2位数字指定的年值是模糊的,因为世纪是未知的。MySQL使用下列规则解释2位年值:
在00-69范围的年值被变换到。 在范围70-99的年值被变换到。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 union all 去重复 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信