【问题标题】:Temporary variable assignment / increment in select query选择查询中的临时变量赋值/增量
【发布时间】:2018-02-24 11:50:06
【问题描述】:

在 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 语句中同时包含临时变量和表列。

【问题讨论】:

  • ... 因为我想处理 @n 的值如何变化 这不清楚,至少对我来说不是。你到底想用@n做什么?
  • @GiorgosBetsos 我的意思是我不想像示例中那样增加1。例如。如果last_name 以'f' 开头,我可以在@n 的分配中添加一个控制块。我现在没有现实生活中的例子,我只是在探索可能性。
  • 您几乎可以肯定仍然想使用row_number,但如果没有具体示例说明您想要什么,没人能回答这个问题。

标签: mysql sql sql-server oracle


【解决方案1】:

使用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

【讨论】:

    【解决方案2】:

    你会使用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 中的一个 hack。

    这只是窗口函数最简单的方法。您需要了解其他排名函数(RANK()DENSE_RANK())。你需要了解PARTITION BY。你需要了解条件聚合/FILTER。我从来没有使用过带有窗口函数的数据库并想:“天哪,我希望我可以使用变量来代替”。我经常有相反的想法。

    【讨论】:

    • 感谢您的回答。正如我所说的Using row_number is not an option,请参阅上面关于我想如何操作@n 变量的评论。
    • @Athafoud 。 . .提出另一个问题并提供样本数据和期望的结果。该声明不清楚。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多