递增整数MSSQL

时间:2015-04-15 19:57:16

标签: sql sql-server

我已经查看过这里已经提出的许多问题,但还没有找到一个我可以适应自己情况的问题。

我目前有一个表格,其中包含用于我已组装的各种网页的下拉列表的值。我正在尝试添加对SMS消息的支持。为此,我在名为SMSID的下拉值表中添加了一列。该值必须是0-999的整数,对于特定的下拉列表而言是唯一的。

因此,例如,我有一个带有多个选项的html选择,我希望每个选项都有一个0到9999的uniqueID,从数据库中加载。

有没有办法使用update语句遍历每条记录并为每个下拉选项添加唯一ID?

表示例:

    FoodType | ingredients | smsID
    Pizza    | pepperoni   | 003
    Pizza    | onions      | 002
    Pizza    | mushrooms   | 000
    Pizza    | olives      | 001
    Sandwich | ham         | 000
    Sandwich | roast beef  | 001
    Sandwich | turkey      | 002

4 个答案:

答案 0 :(得分:2)

CTE更新方法比子查询或自连接快得多

SQL Fiddle Demo

;WITH t(old,new) AS (
  SELECT
    smsID
   ,REPLACE(STR(ROW_NUMBER() OVER(PARTITION BY FoodType ORDER BY ingredients)-1,3),' ','0')
  FROM MyTable
)
UPDATE t
SET old = new

答案 1 :(得分:1)

如果您使用的是SQL Server 2005或更高版本,则可以使用ROW_NUMBER()对行进行编号。

SELECT FoodType, ingredients,
    ROW_NUMBER OVER(PARTITION BY FoodType ORDER BY ingredients) smsID
FROM dropdowns

答案 2 :(得分:1)

http://sqlfiddle.com/#!6/fed58/5/0

UPDATE ft
SET smsID= RIGHT('000' + CONVERT(VARCHAR,Row-1),3)
FROM foodtype ft
inner join (
  select
    Row_Number() OVER (PARTITION BY FoodType ORDER BY ingredients ASC) [Row],
    *
  FROM FoodType
) a ON a.FoodType=ft.FoodType AND a.ingredients=ft.ingredients

答案 3 :(得分:0)

这应该这样做:

SELECT FoodType, Ingredients, ROW_NUMBER() OVER (PARTITION BY FoodType ORDER BY FoodType) AS smsID
FROM dbo.Dropdowns