我的任务是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语句完成此操作?
答案 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