2

我的任务是处理超出我有限的 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

我不确定如何使用插入语句来完成?

4

4 回答 4

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 表中为您的“小部件”字段编制索引,并且您希望确保为每个新小部件输入了一个值。


编辑:哦,另外,要获得第二个列出的确切表,您可以将 widgets 表连接到 widget_ids 表:

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

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

于 2009-04-02T16:39:04.957 回答
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
于 2009-04-02T16:47:14.110 回答
0

好吧,它不会通过插入语句来完成。

创建一个带有 auto_increment id 和 distinct 小部件的临时表。

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

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

于 2009-04-02T16:50:01.483 回答
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
于 2009-04-02T16:55:00.737 回答