我有一个我无法修改的现有应用。它需要执行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] )
每次将记录添加到表格中时我都需要这样做(是的,如果添加了比我年轻的人,我的组号会发生变化 - 请不要问。)
答案 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,但这是基于标准的相当代码。