在SQL中写回GROUP编号

时间:2011-05-29 18:30:33

标签: sql group-by sql-update

我有一个我无法修改的现有应用。它需要执行SQL GROUP BY,但不能。但是,它可以并且确实从同一个表中读取GroupNumber字段。

我现在正在做的是执行分组SQL语句,在代码中处理它并将GroupNumber写回到表中,以便App可以执行其操作。我想要做的是执行一个SQL语句,只需一步即可完成分组和回写。如果确实有可能,我无法弄清楚如何做到这一点。简单的例子:

  SELECT FirstName, LastName, Age 
    FROM Persons 
   WHERE .... 
GROUP BY Age 
ORDER BY Age

我执行此操作,然后执行

for ( i = 1; i <= result_set.n; i++ )
  Sql = “UPDATE Persons 
            SET GroupNumber  = “ + fixed( i ) 
       + “WHERE Age = “ + fixed( result_set.Age[i] )

每次将记录添加到表格中时我都需要这样做(是的,如果添加了比我年轻的人,我的组号会发生变化 - 请不要问。)

2 个答案:

答案 0 :(得分:0)

显然你想要一个触发器。但是,触发器定义因数据库服务器而异。我猜错了,并说你正在使用某些版本的Microsoft SQL Server:创建触发器语法和几个例子可以在http://msdn.microsoft.com/en-us/library/ms189799.aspx找到。可能有一些小的并发症,触发器修改它从中获取数据的同一个表,但我相信你通常可以在大多数SQL服务器数据库中执行此操作(SQLite可能是少数难以解决的问题之一)。

尝试一下,看看是否有帮助。

答案 1 :(得分:0)

我不确定你的目标是什么,这是我最好的猜测:

;WITH AllRows AS (--get one row per age, and number them
SELECT
    Age, ROW_NUMBER() OVER (PARTITION BY AGE ORDER BY Age) AS RowNumber
    FROM Persons
    WHERE ...
    GROUP BY Age
)
UPDATE p --update all the people, getting their GroupNumber based on their Age's row number
    SET GroupNumber=a.RowNumber
    FROM Persons           p
        INNER JOIN AllRows a ON p.Age=a.Age
    WHERE GroupNumber IS NULL OR GroupNumber!=a.RowNumber

我使用SQL Server,但这是基于标准的相当代码。