繁体   English   中英

sql server介意记录插入位置的方式吗?

Does sql server minds the way records where inserted?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

(“如何运作”-问题)

假设我有这张桌子:

   Id            val
    ------------------
    1             a       <--
    1             a
    1             a
    2             b       <--
    2             b
    2             b

现在说我想要标记的行:

我可以依靠这个查询:

select id,val from (
select id , val , row_number() over (partition by id order by id) as rn
) k where rn=1

给我选择的行?

(请注意order by子句)。 会将订单视为插入的订单吗?

2 个回复

该行为不能得到保证。 您的查询将返回两行,但是哪一行是未定义的。

当我尝试

create table #t (id int, val char(1), t timestamp)
insert #t  (id, val) values (1,'a')
insert #t  (id, val) values (1,'a')
insert #t  (id, val) values (2,'b')

insert #t  (id, val) values (1,'a')
insert #t  (id, val) values (2,'b')
insert #t  (id, val) values (2,'b')
select * from #t 

select * from ( 
select *, row_number() over (partition by id order by id) as rn from #t  
) k where rn=1 


drop table #t

结果是可变的,取决于插入的顺序,但不一致的是前插入的行。

不,行的顺序只能由ORDER BY子句确定-如果您的ORDER BY子句在两行之间不是确定性的,则返回它们的顺序是任意的。 您将需要添加一些东西来使其唯一化,以便能够做到这一点。 但是,作为一般规则,大多数表应具有唯一键或主键-从而为您提供可以排序的内容。

各种因素都会影响它,例如企业版中的旋转木马扫描,聚簇索引的重新索引等。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题
 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM