2017-09-15 63 views
0

在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的任何等同方法服务器

注:

  1. 一些与SQL Server中的update可以做类似的事情,但我问是否可以用select来完成。

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

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

+0

* ...因为我要处理的是如何@n的观念正在转变*这是不明确的,至少不能我。你真的想用'@ n'做什么? –

+0

@GiorgosBetsos我的意思是我不想像'1'那样增加这个例子。例如。如果last_name以'f'开始,我可以在'@ n'的赋值中添加一个控制块。我现在没有一个真实的例子,我只是在探索可能性。 – Athafoud

+1

你几乎肯定仍然想使用'row_number',但没有你想要的具体例子,没有人能回答这个问题。 – DavidG

回答

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。我从来没有使用过窗口函数的数据库,并认为:“天哪,我希望我可以使用变量”。我经常想到相反的情况。

+0

感谢您的回答。正如我所说的“使用row_number不是一个选项”,请参阅我上面关于如何操作'@ n'变量的评论。 – Athafoud

+0

@Athafoud。 。 。询问另一个问题并提供样本数据和期望的结果。该声明不明确。 –

0

如果你要使用变量,必须首先声明他们:

DECLARE @n int 
    SET @n = '...' 
0

使用row_number是不是一种选择,因为我要处理如何@n的观念正在转变。

甲骨文 - 使用递归子查询保条款:

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