【问题标题】:Does sql server minds the way records where inserted?sql server 是否介意插入记录的方式?
【发布时间】:2012-09-13 08:41:53
【问题描述】:

(一个“它是如何工作的” - 问题)

假设我有这张桌子:

   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 子句)。它会认为顺序是它们被插入的顺序吗?

【问题讨论】:

  • 这个问题是不是来自this question@?
  • @hims056 确实如此。我也在那里回答。但 somoenes 的评论引起了我的注意。

标签: sql-server sql-server-2008-r2 sql-order-by


【解决方案1】:

无法保证该行为。您的查询将返回两行,但哪些是未定义的。

当我尝试

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

结果是可变的,取决于插入的顺序,但不是始终如一的第一个插入的行。

【讨论】:

    【解决方案2】:

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

    各种因素都会对其产生影响,例如企业版中的旋转木马扫描、聚集索引的重新索引等。

    【讨论】:

      猜你喜欢
      • 2015-12-17
      • 2018-09-20
      • 1970-01-01
      • 2011-05-09
      • 2010-09-22
      • 2016-03-14
      • 2016-06-02
      • 2016-03-07
      • 1970-01-01
      相关资源
      最近更新 更多