为 Microsoft sql server 视图中的每一行分配 ID

Posted

技术标签:

【中文标题】为 Microsoft sql server 视图中的每一行分配 ID【英文标题】:Assign ID to each row in Microsoft sql server view 【发布时间】:2014-09-06 13:54:58 【问题描述】:

假设我有一张这样的桌子:

create table MyTable (
 Myname varchar (10) primary key not null

) 和几行数据,例如:

insert into MyTable values ('john');
insert into MyTable values ('Brad');
insert into MyTable values ('James');
insert into MyTable values ('Anna');
insert into MyTable values ('Eric');
insert into MyTable values ('Hossein');

我想创建一个为每一行分配一个 ID 的视图, 我使用了下面的 select 语句:

   select rank() OVER (ORDER BY Myname) as ID, MyTable.Myname 
   from MyTable 
   order by ID 

结果还算可以接受,但是当我尝试创建视图时问题就出来了

create view myview as 
 select rank() OVER (ORDER BY Myname) as ID, MyTable.Myname 
   from MyTable 
   order by ID 

我的问题是:

1- 如何从上面提到的 select 语句创建视图?

2- 我可以使用其他方法吗?

【问题讨论】:

除了您在没有top 的视图中使用order by 之外,您的查询有什么问题? 非常感谢您的精彩回答。不,通过 ID 删除订单仍然有效。 @HoseinDjadidi Gordon 下面的回答比我的回答更能解决您的具体问题。如果你接受他的回答,我可以删除我的。 【参考方案1】:

order by 不允许出现在视图中,除非您使用 top。根据documentation:

视图定义中的 SELECT 子句不能包含以下内容:

一个 ORDER BY 子句,除非 SELECT 语句的选择列表中还有一个 TOP 子句

所以,没有order by,你的陈述很好:

create view myview as 
   select rank() OVER (ORDER BY Myname) as ID, MyTable.Myname 
   from MyTable ;

即使您在top 中包含order by,也不能保证结果按特定顺序排列。您只能通过使用order by 外部查询来保证。

【讨论】:

实际数据集很大,并且是按日期排序的(差不多15000行数据),是否有可能分配给每一行视图的ID出现乱序?谢谢。 (1) 15,000 行并不大。 (2) rank是由数据库定义的,每次运行都会重新计算,所以不能“乱序”。结果数据集可能不会按顺序返回,但会正确分配排名。

以上是关于为 Microsoft sql server 视图中的每一行分配 ID的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2008安装出错,试图执行未经授权的操作。

sql server 2008安装出错,试图执行未经授权的操作。

为啥SQL数据库不能用SQL Server身份登录 提示用户sa登录失败。(Microsoft SQL server,错误18456)

为啥SQL数据库不能用SQL Server身份登录 提示用户sa登录失败。(Microsoft SQL server,错误18456)

跟我一起学Microsoft SQL Server 2012 Internals(3.2)

SQL Server 中的视图