替代 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 tablesp_chgattributeidentity_gap 设置(用于更改当前 table 的身份属性)
  • 对于 select/into 请参阅 identity_gap 选项
  • 以上代码在 ASE 16.0 SP04 GA
  • 中测试