在sql中为每个唯一值插入增量

时间:2009-04-02 16:32:38

标签: mysql increment group-by

我的任务是SQL问题超出了我所拥有的sql知识范围。我有以下问题。

我有一张目前看起来像这样的表:

 widgets
---------
    a
    a
    a
    b
    b
    c
    d
    d
    d

我想要另一个表,每个唯一值按递增编号......就像这样:

widgets  | widget_id
--------- ----------
    a    |    1
    a    |    1
    a    |    1
    b    |    2
    b    |    2
    c    |    3
    d    |    4
    d    |    4
    d    |    4

我不确定如何使用insert语句完成此操作?

4 个答案:

答案 0 :(得分:1)

创建一个包含IDENTITY列的表:

类似的东西:

CREATE TABLE widget_ids (
  widget_id INT AUTO_INCREMENT PRIMARY KEY,
  widget varchar(5)
)

运行此命令:

INSERT INTO
  widget_ids (widget)
SELECT DISTINCT
  widget
FROM
  widgets

现在,这只是一个例子。如果您想要一个长期解决方案,您可能希望在widget_ids表中索引“窗口小部件”字段,并且您希望确保为每个新窗口小部件输入值。


编辑:哦,另外,为了获得您列出的第二个确切表,您可以将小部件表连接到widget_ids表:

SELECT
    w.widget,
    wi.widget_id
FROM
    widgets w
LEFT JOIN
    widget_ids wi
  ON
    w.widget = wi.widget

当然,在这里,索引是你的朋友。

答案 1 :(得分:0)

我认为服务器端游标可能是您的最佳选择。我相信以下内容可行:

DECLARE @widgets varchar(20)
DECLARE @widget_id int
DECLARE @widget_count int
DECLARE @index int

DECLARE widgets_cursor CURSOR FOR
SELECT [widgets], COUNT(*)
FROM [original_widgets_table]
GROUP BY [widgets]

SET @widget_id = 0

OPEN widgets_cursor

FETCH NEXT FROM widgets_cursor INTO @widget, @widget_count
WHILE @@FETCH_STATUS = 0
BEGIN
  SET @widget_id = @widget_id + 1
  SET @index = 0

  WHILE @index < @widget_count
  BEGIN
    INSERT [new_widgets_table]
    (
    widget
    , widget_id
    )
    SELECT
    @widget
    , @widget_id

    SET @index = @index + 1
  END

  FETCH NEXT FROM widgets_cursor INTO @widget, @widget_count
END

CLOSE widgets_cursor

DEALLOCATE widgets_cursor

答案 2 :(得分:0)

嗯,使用insert语句不能完成。

使用auto_increment id和distinct小部件创建临时表。

然后将小部件表加入临时表,并使用临时表的id更新小部件。

您在这里做的是规范化您的数据。一旦你有一个(不同的小部件,id)的表,你就会有任何其他需要引用小部件的表,而是引用它生成的小部件ID。

答案 3 :(得分:0)

我的MySQL语法不是很好,但假设你已经创建了上面的新表,那么这样的工作会不会有用呢?

set @i = 0; 

create temporary table t_widget_id
as 
    select distinct widgets, @i:=@i+1 as widget_id from widgets

insert into widget_new
    select widgets.widgets,
            t_widget_id.widget_id
        from
            widgets inner join
                t_widget_id 
                    on widgets.widgets = t_widget_id.widgets

drop table t_widget_id