选择查询中的临时变量赋值/增量

时间:2017-09-15 10:04:37

标签: mysql sql sql-server oracle

在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中是否存在任何等效方法

注意:

  1. 在SQL Server中可以使用update进行类似的操作,但我问是否可以使用select来完成。

  2. 使用row_number不是一个选项,因为我想处理@n的值如何变化。

  3. 我知道SQL Server不允许在select语句中同时包含临时变量和表列。

3 个答案:

答案 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