如果没有id,则保持字符的排序(SQL Server 2005)

pri*_*kar 0 t-sql sql-server sql-server-2005

我有以下内容

个字符

A
C
W
B
J
M
Run Code Online (Sandbox Code Playgroud)

如何插入一些序列号,以便在插入数字后字符的顺序不会改变?

我的意思是如果我使用row_number(),输出字符顺序就会改变

select 
ROW_NUMBER() over(order by chars) as id,
t.* from @t t
Run Code Online (Sandbox Code Playgroud)

输出:

id chars

1   A
2   B
3   C
4   J
5   M
6   W
Run Code Online (Sandbox Code Playgroud)

我期望的期望是

id chars

1   A
2   C
3   W
4   B
5   J
6   M
Run Code Online (Sandbox Code Playgroud)

此外,我不能使用任何身份字段,id int identity因为我在查询的中间,我需要维护内部联接以实现某些目标.

我希望我能清楚自己.

请帮忙.提前致谢

mjv*_*mjv 5

SQL中没有行的隐式排序.如果需要某些排序,无论是插入项目的顺序还是任何其他顺序,它都必须由用户定义的列支持.

换句话说,SQL标准不要求SQL实现维护任何顺序.另一方面,SELECT语句中的ORDER BY子句可用于指定所需的顺序,但特定(再次,用户定义)列中的值支持此类排序.

此用户定义列可能是一个自动递增的列,SQL为其分配增量(或其他)值,这可能是您需要的.

也许像...

CREATE TABLE myTable
(
   InsertID smallint IDENTITY(1,1),
   OneChar  CHAR(1),
   SomeOtherField VARCHAR(20)
   -- ... etc.
)

INSERT INTO myTable (OneChar, SomeOtherField) VALUES ('A', 'Alpha')
INSERT INTO myTable (OneChar, SomeOtherField) VALUES ('W', 'Whiskey')
INSERT INTO myTable (OneChar, SomeOtherField) VALUES ('B', 'Bravo')
-- ... etc.

SELECT OneChar
FROM myTable
ORDER BY InsertId

'A'
'W'
'B'
--...
Run Code Online (Sandbox Code Playgroud)