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テーブルの「widget」フィールドにインデックスを付け、新しいウィジェットごとに値が入力されていることを確認する必要があります。


編集:ああ、また、2番目にリストした正確なテーブルを取得するには、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 と個別のウィジェットを使用して一時テーブルを作成します。

次に、ウィジェット テーブルを一時テーブルに結合し、ウィジェットを一時テーブルの 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 に答える