在MySQL中你可以做这样的事情
SELECT @n := @n + 1 n,
first_name,
last_name
FROM table1, (SELECT @n := 0) m
ORDER BY first_name, last_name
*(代码块最初取自https://stackoverflow.com/a/16555527/2279200)
Oracle或SQL Server中是否存在任何等效方法
注意:
在SQL Server中可以使用update
进行类似的操作,但我问是否可以使用select来完成。
使用row_number
不是一个选项,因为我想处理@n的值如何变化。
我知道SQL Server不允许在select语句中同时包含临时变量和表列。
答案 0 :(得分:1)
您可以使用ROW_NUMBER()
:
SELECT row_number() over (order by first_name, last_name)
first_name,last_name
FROM table1
ORDER BY first_name, last_name;
这不仅仅是“另一种方式”。 ROW_NUMBER()
是实现此功能的ANSI标准方法 - 您应该了解其他排名和窗口/分析函数。使用变量是MySQL中的一个黑客。
这只是窗口函数的最简单方法。您需要了解其他排名函数(RANK()
和DENSE_RANK()
)。您需要了解PARTITION BY
。您需要了解条件聚合/ FILTER
。我从未使用过具有窗口函数的数据库,并且想:“天哪,我希望我可以使用变量”。我经常想到相反的事情。
答案 1 :(得分:0)
如果你打算使用变量,你必须先声明它们:
DECLARE @n int
SET @n = '...'
答案 2 :(得分:0)
使用
row_number
不是一种选择,因为我想处理@n
的值如何变化。
Oracle - 使用递归子查询分解子句:
WITH ordered_names ( rn, first_name, last_name ) AS (
SELECT ROW_NUMBER() OVER ( ORDER BY first_name, last_name ),
first_name,
last_name
FROM table1
),
indexed_names ( rn, n, first_name, last_name ) AS (
SELECT rn, 1, first_name, last_name FROM ordered_names WHERE rn = 1
UNION ALL
SELECT o.rn,
i.n + 1, -- Your logic here,
o.first_name,
o.last_name
FROM ordered_names o
INNER JOIN
indexed_names i
ON ( o.rn = i.rn + 1 )
)
SELECT n, first_name, last_name
FROM indexed_names