【问题标题】:How to generate RowID in Sql server 2000 without using identity column如何在不使用标识列的情况下在 Sql server 2000 中生成 RowID
【发布时间】:2011-09-23 10:13:12
【问题描述】:

让我提出我的问题....

我说过

Name

A
B
C
A
D
B

我想要的是

ID   Name
1    A
2    B
3    C
4    A
5    D
6    B

如果我写 SELECT name, (SELECT COUNT(*) FROM @t AS i2 WHERE i2.Name <= i1.Name) As rn FROM @t AS i1

如果所有名称都是不同的/唯一的,它会正常工作...如果它们不是(如本例所示)怎么办

即使 NEWID() 随着时间的推移而变化,也不会成功?

我正在使用 sql server 2000...

请帮忙

【问题讨论】:

  • 为什么不使用your previous question的解决方案??
  • 另外,这是为了某种程度的“工作正常”,因为你在那里有一个三角形连接,也就是半个交叉连接,也就是 rbar(逐行排列)。
  • 真正的问题是你为什么需要row_number?即,您要解决的问题是什么。那么也许有一个不需要row_number的替代解决方案。
  • 不要再说“我不能使用身份列”。使用临时表/表变量没有架构更改。如果您想使用较慢的 triangulat COUNT 连接,请按照其他问题的答案进行操作。

标签: tsql sql-server-2000


【解决方案1】:

这里有两种解决方法

1.

DECLARE @t TABLE ([ID] [int] IDENTITY(1,1), name CHAR)
INSERT @t VALUES ('b')
INSERT @t VALUES ('a')
INSERT @t VALUES ('c')
INSERT @t VALUES ('b')

SELECT * FROM @t

2.

DECLARE @t2 TABLE (name CHAR)
INSERT @t2 (name) VALUES ('b')
INSERT @t2 (name) VALUES ('a')
INSERT @t2 (name) VALUES ('c')
INSERT @t2 (name) VALUES ('b')

SELECT ID = ROW_NUMBER() OVER (ORDER BY b), name 
FROM (SELECT name, null b FROM @t2) temp

【讨论】:

  • 'ROW_NUMBER' 不是可识别的函数名称
  • @Apocatastasis 在 sqlserver 2008 之后是
猜你喜欢
  • 2012-09-16
  • 2011-08-21
  • 2018-10-04
  • 2010-09-18
  • 1970-01-01
  • 2011-04-09
  • 2012-05-31
  • 2015-10-04
  • 1970-01-01
相关资源
最近更新 更多