给定Sybase数据库中的表MY_TABLE
,包括COLUMN_A
,COLUMN_B
,COLUMN_C
,SORTER_COLUMN
,我想选择如下:< / p>
SELECT COLUMN_A, COLUMN_B, SORTER_COLUMN, SEQUENCE
FROM MY_TABLE
WHERE COLUMN_C = 'SOMETHING'
ORDER BY SORTER_COLUMN
其中SEQUENCE
表示按SORTER_COLUMN
排序的序列 - 从1,2,3,......等开始。我怎样才能在Sybase中实现这一目标?
我曾经在新表中插入记录,其中包含定义为 IDENTIFIER 的列SEQUENCE
。但我需要一个解决方案,直接将序列添加到select中,而不必插入表中。
答案 0 :(得分:1)
如果您使用Sybase的更高版本(至少版本12),您可以使用NUMBER(*)功能:
SELECT COLUMN_A, COLUMN_B, SORTER_COLUMN, Number(*) as SEQUENCE
FROM MY_TABLE
WHERE COLUMN_C = 'SOMETHING'
ORDER BY SORTER_COLUMN
或ROW_NUMBER()功能
SELECT COLUMN_A, COLUMN_B, SORTER_COLUMN, ROW_NUMBER() OVER (ORDER BY SORTER_COLUMN) SEQUENCE
FROM MY_TABLE
WHERE COLUMN_C = 'SOMETHING'
ORDER BY SORTER_COLUMN
<强>更新强>
正如amyassin在下面评论的那样,上述两个函数在Sybase 15.7中都不起作用,尽管它们已在规范中记录。因此,我认为您唯一的选择是使用相关查询,如下所示:
SELECT b.COLUMN_A, b.COLUMN_B, b.SORTER_COLUMN,
(select count(*)+1 from MY_TABLE a where a.SORTER_COLUMN < b.SORTER_COLUMN) as SEQUENCE
FROM MY_TABLE b
WHERE b.COLUMN_C = 'SOMETHING'
ORDER BY b.SORTER_COLUMN
答案 1 :(得分:-1)
使用为每行递增的局部变量。在FROM子句中初始化它,您必须在其中为别名赋予它。
SELECT COLUMN_A, COLUMN_B, SORTER_COLUMN, (@n := @n + 1) AS SEQUENCE
FROM MY_TABLE, (SELECT @n := 0) as WHATEVER;