Вставка приращения для каждого уникального значения в sql - PullRequest
2 голосов
/ 02 апреля 2009

Передо мной была поставлена ​​задача 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 ]

1 голос
/ 02 апреля 2009

Создать таблицу со столбцом 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

И здесь, конечно, индексирование - ваш друг.

0 голосов
/ 02 апреля 2009

Мой синтаксис 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
0 голосов
/ 02 апреля 2009

Ну, этого нельзя сделать с помощью оператора вставки.

создать временную таблицу с идентификатором auto_increment и отдельным виджетом.

Затем присоедините таблицу виджетов к временной таблице и обновите виджет с помощью идентификатора временной таблицы.

То, что вы здесь делаете, нормализует ваши данные. Если у вас есть таблица (отдельный виджет, идентификатор), у вас будет любая другая таблица, которая должна ссылаться на виджет, а не ссылаться на генерируемый идентификатор виджета.

0 голосов
/ 02 апреля 2009

Я думаю, что серверные курсоры, вероятно, ваш лучший вариант для этого. Я считаю, что будет работать следующее:

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
...