替代 row_number 在 Sybase 中创建唯一列?
Alternative to row_number to create a unique column in Sybase?
问题
我有一些临时表,我想在其中添加一个具有唯一标识符的列。
理想情况下,我希望此列包含增量整数(例如 1、2、3、4 等)。
或者,作为次优选择,我可以满足于唯一值,而不考虑顺序(例如 AAA、AAB 等)。
我的约束
在 SQL 女士中,我通常会用 row_number()
来做。不幸的是,我使用的 sybase (Adaptive Server Enterprise 16) 版本似乎不支持 row_number()
也不支持 cross apply
.
可重现的例子
下面的代码在 Ms SQL 中有效,但在 Sybase 中无效。我发现了很多类似的问题,但所有答案都依赖于 row_number()
的某些变体,这对我不起作用。如果我 运行 它,我得到
incorrect syntax near the keyword 'over'
我的代码是:
CREATE TABLE #my_test (my_date datetime, my_value float NULL )
go
INSERT INTO #my_test SELECT '1-Nov-2021',100
INSERT INTO #my_test SELECT '2-Nov-2021',110
INSERT INTO #my_test SELECT '3-Nov-2021',100
INSERT INTO #my_test SELECT '4-Nov-2021',110
INSERT INTO #my_test SELECT '5-Nov-2021',108
INSERT INTO #my_test SELECT '6-Nov-2021',105
go
select
*, row_number() over (order by (select NULL)) as my_id
from #my_test
这就是 identity
列属性的用途,例如:
CREATE TABLE #my_test
(my_id int identity -- pick a data type that'll be big enough to hold all future values
,my_date datetime
,my_value float NULL
)
go
-- exclude identity column from INSERT (column_list):
INSERT INTO #my_test (my_date, my_value) SELECT '1-Nov-2021',100
INSERT INTO #my_test (my_date, my_value) SELECT '2-Nov-2021',110
INSERT INTO #my_test (my_date, my_value) SELECT '3-Nov-2021',100
INSERT INTO #my_test (my_date, my_value) SELECT '4-Nov-2021',110
INSERT INTO #my_test (my_date, my_value) SELECT '5-Nov-2021',108
INSERT INTO #my_test (my_date, my_value) SELECT '6-Nov-2021',105
go
select * from #my_test
order by my_date
go
my_id my_date my_value
----------- ------------------------------- ---------------------------
1 Nov 1 2021 12:00AM 100.000000
2 Nov 2 2021 12:00AM 110.000000
3 Nov 3 2021 12:00AM 100.000000
4 Nov 4 2021 12:00AM 110.000000
5 Nov 5 2021 12:00AM 108.000000
6 Nov 6 2021 12:00AM 105.000000
为 select into
添加标识列:
select my_id2=identity(int), -- define new identity column name and precision
my_date,
my_value
into #my_test2
from #my_test
order by my_date
go
select * from #my_test2
order by my_date
go
my_id2 my_date my_value
----------- ------------------------------- ---------------------------
1 Nov 1 2021 12:00AM 100.000000
2 Nov 2 2021 12:00AM 110.000000
3 Nov 3 2021 12:00AM 100.000000
4 Nov 4 2021 12:00AM 110.000000
5 Nov 5 2021 12:00AM 108.000000
6 Nov 6 2021 12:00AM 105.000000
备注:
- OP 会想了解身份差距和身份消耗因素
- 主要问题是 if/when ASE 很难关闭,启动后您会看到最后一个标识值和新标识值之间存在显着差异
- 请参阅
create table
和 sp_chgattribute
的 identity_gap
设置(用于更改当前 table 的身份属性)
- 对于
select/into
请参阅 identity_gap
选项
- 以上代码在
ASE 16.0 SP04 GA
中测试
问题
我有一些临时表,我想在其中添加一个具有唯一标识符的列。
理想情况下,我希望此列包含增量整数(例如 1、2、3、4 等)。
或者,作为次优选择,我可以满足于唯一值,而不考虑顺序(例如 AAA、AAB 等)。
我的约束
在 SQL 女士中,我通常会用 row_number()
来做。不幸的是,我使用的 sybase (Adaptive Server Enterprise 16) 版本似乎不支持 row_number()
也不支持 cross apply
.
可重现的例子
下面的代码在 Ms SQL 中有效,但在 Sybase 中无效。我发现了很多类似的问题,但所有答案都依赖于 row_number()
的某些变体,这对我不起作用。如果我 运行 它,我得到
incorrect syntax near the keyword 'over'
我的代码是:
CREATE TABLE #my_test (my_date datetime, my_value float NULL )
go
INSERT INTO #my_test SELECT '1-Nov-2021',100
INSERT INTO #my_test SELECT '2-Nov-2021',110
INSERT INTO #my_test SELECT '3-Nov-2021',100
INSERT INTO #my_test SELECT '4-Nov-2021',110
INSERT INTO #my_test SELECT '5-Nov-2021',108
INSERT INTO #my_test SELECT '6-Nov-2021',105
go
select
*, row_number() over (order by (select NULL)) as my_id
from #my_test
这就是 identity
列属性的用途,例如:
CREATE TABLE #my_test
(my_id int identity -- pick a data type that'll be big enough to hold all future values
,my_date datetime
,my_value float NULL
)
go
-- exclude identity column from INSERT (column_list):
INSERT INTO #my_test (my_date, my_value) SELECT '1-Nov-2021',100
INSERT INTO #my_test (my_date, my_value) SELECT '2-Nov-2021',110
INSERT INTO #my_test (my_date, my_value) SELECT '3-Nov-2021',100
INSERT INTO #my_test (my_date, my_value) SELECT '4-Nov-2021',110
INSERT INTO #my_test (my_date, my_value) SELECT '5-Nov-2021',108
INSERT INTO #my_test (my_date, my_value) SELECT '6-Nov-2021',105
go
select * from #my_test
order by my_date
go
my_id my_date my_value
----------- ------------------------------- ---------------------------
1 Nov 1 2021 12:00AM 100.000000
2 Nov 2 2021 12:00AM 110.000000
3 Nov 3 2021 12:00AM 100.000000
4 Nov 4 2021 12:00AM 110.000000
5 Nov 5 2021 12:00AM 108.000000
6 Nov 6 2021 12:00AM 105.000000
为 select into
添加标识列:
select my_id2=identity(int), -- define new identity column name and precision
my_date,
my_value
into #my_test2
from #my_test
order by my_date
go
select * from #my_test2
order by my_date
go
my_id2 my_date my_value
----------- ------------------------------- ---------------------------
1 Nov 1 2021 12:00AM 100.000000
2 Nov 2 2021 12:00AM 110.000000
3 Nov 3 2021 12:00AM 100.000000
4 Nov 4 2021 12:00AM 110.000000
5 Nov 5 2021 12:00AM 108.000000
6 Nov 6 2021 12:00AM 105.000000
备注:
- OP 会想了解身份差距和身份消耗因素
- 主要问题是 if/when ASE 很难关闭,启动后您会看到最后一个标识值和新标识值之间存在显着差异
- 请参阅
create table
和sp_chgattribute
的identity_gap
设置(用于更改当前 table 的身份属性) - 对于
select/into
请参阅identity_gap
选项 - 以上代码在
ASE 16.0 SP04 GA
中测试