2009-04-02 2 views
2

У меня была задана проблема SQL, которая находится за пределами ограниченной области знаний 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 

Я m не знаете, как это будет сделано с помощью инструкции insert?

+0

Нужно ли это делать, используя только mysql? Это было бы очень легко сделать, написав внешнюю программу для обработки вставок. Кроме того, нужна ли новой таблице 3 строки с (a, 1), как вы показали, или только один? –

ответ

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, и вам нужно убедиться, что для каждого нового виджета было введено значение.


EDIT: Ой, а также, чтобы получить точную таблицу вы перечислили второй, вы бы оставили присоединиться к таблице виджетов к WIDGET_IDS таблице:

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

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

+0

Это даст только отличные значения виджетов. Это не совсем вопрос. –

+0

Левое соединение дает почти то же, что спрашивает пользователь. Однако кажется, что он приближается к этому назад ... –

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 
0

Ну, это не было бы сделано с помощью инструкции insert.

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

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

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

0

Мой синтаксис MySQL не очень хорош, но если вы создали свою новую таблицу выше, не было бы чем-то вроде этой работы?

set @i = 0; 

create temporary table t_widget_id 
as 
    select distinct widgets, @i:[email protected]+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 
Смежные вопросы