SQL SERVER,带有自动生成行ID的SELECT语句

时间:2020-03-06 14:45:58  来源:igfitidea点击:

是否有人记得用于生成内置SQL Server 2000的顺序行号的函数名。

解决方案

如果我们使用的是GUID,那应该很容易,如果我们要查找整数ID,则必须等待其他答案。

SELECT newId() AS ColId, Col1, Col2, Col3 FROM table1

newId()将为我们生成一个新的GUID,我们可以将其用作自动生成的id列。

这也许是我们要找的东西吗?

select NEWID() * from TABLE

如果要进行选择,则IDENTITY(int,1,1)应该这样做。在SQL 2000中,我只是将结果放在临时表中,然后查询该后记。

我们是否希望记录集返回递增的整数列?如果是这样: -

--Check for existance  
if  exists (select * from dbo.sysobjects where [id] = object_id(N'dbo.t') AND objectproperty(id, N'IsUserTable') = 1)  
drop table dbo.t
go

--create dummy table and insert data  
create table dbo.t(x char(1) not null primary key, y char(1) not null)  
go  
set nocount on  
insert dbo.t (x,y) values ('A','B')  
insert dbo.t (x,y) values ('C','D')  
insert dbo.t (x,y) values ('E','F')

--create temp table to add an identity column  
create table dbo.#TempWithIdentity(i int not null identity(1,1) primary key,x char(1) not null unique,y char(1) not null)  

--populate the temporary table  
insert into dbo.#TempWithIdentity(x,y) select x,y from dbo.t

--return the data  
select i,x,y from dbo.#TempWithIdentity

--clean up  
drop table dbo.#TempWithIdentity

我们可以按照Microsoft的页面在SQL2000中直接执行此操作:http://support.microsoft.com/default.aspx?scid=kb;zh-cn;186133

select rank=count(*), a1.au_lname, a1.au_fname
   from authors a1, authors a2
   where a1.au_lname + a1.au_fname >= a2.au_lname + a2.au_fname
   group by a1.au_lname, a1.au_fname
   order by rank

这种方法的唯一问题是(就像Jeff在SQL Server Central上说的那样),它是一个三角形联接。因此,如果我们有十个记录,这将很快,如果我们有一千个记录,这将很慢,而拥有一百万个记录,则可能永远无法完成!

参见此处,以获得三角连接的更好说明:http://www.sqlservercentral.com/articles/T-SQL/61539/

Select (Select count(y.au_lname) from dbo.authors y
where y.au_lname + y.au_fname <= x.au_lname + y.au_fname) as Counterid,
x.au_lname,x.au_fname from authors x group by au_lname,au_fname
order by Counterid --Alternatively that can be done which is equivalent as above..