0

非正規化された形式の大きなデータセットがあります。列名の例を次に示します。

external_key_ID、P1、P2、P3、P4、P5 .... D1、D2、D3....など。

これらのフィールドにはすべて、同様のタイプのデータが含まれています。

これを既存のテーブル構造に正規化する必要があります。

insert into new_table (id, name, index)
select foreign_key_id, P1, 1
from denormalized_table;

ただし、これは、非正規化されたテーブルのフィールドごとに個別のクエリを実行する必要があることを意味します。いくつか変更するだけです。

insert into new_table (id, name, index)
select foreign_key_id, P2, 2
from denormalized_table;

私がこれらのフィールドをいくつ持っているかを考えると、これは退屈になります。

これを自動化して1つの操作にする方法はありますか?つまり、フィールドを繰り返し処理し(適格なフィールドのリストをどこかで一度作成してもかまいません)、そのフィールド名の最後の桁を削除します(つまり、「P1」の「1」と「P2」の「2」)副選択でフィールド名と抽出されたインデックス#を使用します。

4

2 に答える 2

1

探しているのは動的 SQL です。これは、プログラムでアセンブルできる SQL ステートメントを実行する場所です。ストアド プロシージャ内にいる限り、文字列内の任意の SQL コードを実行できます。このリンクを参照してください: MySQL ストアド プロシージャで動的 SQL を使用する方法

基本的に、一連の列を反復処理することにより、mySQL ステートメントを使用して文字列を作成できます。SHOW COLUMNS 構文 ( http://dev.mysql.com/doc/refman/5.0/en/show-columns.htmlを参照) を使用してコレクションを返し、その結果セットをループして動的クエリ文字列を構築し、実行することができますその方法。

SHOW COLUMNS FROM myTable WHERE Field NOT IN (pkey, otherFieldIDontWantToInclude)
于 2013-02-04T19:22:10.580 に答える
1

ここから始めましょう:

SELECT column_name, substr(column_name,2) AS `index`
  FROM information_schema.columns
 WHERE table_schema = 'mydatabasename'
   AND table_name = 'denormalized_table'
   AND column_name REGEXP '^[PD][0-9]+$'
 ORDER BY column_name

そのステートメントの選択リストを変更して、MySQL にステートメントを生成させることができます。

SELECT CONCAT('INSERT INTO new_table (id, name, `index`) SELECT foreign_key_id, '
         ,column_name,', ',substr(column_name,2)
         ,' FROM denormalized_table ;') AS stmt
  FROM information_schema.columns
 WHERE table_schema = 'mydatabasename'
   AND table_name = 'denormalized_table'
   AND column_name REGEXP '^[PD][0-9]+$'
 ORDER BY column_name

その出力は、後で実行できる一連の MySQL INSERT ステートメントになります。


挿入するデータの行数と合計サイズがそれほど大きくない場合、変換全体を「1 回の操作」で完了させたい場合は、単一の INSERT INTO ... SELECT ステートメントを生成できます。 UNION ALL 演算子を使用します。私は次のようなステートメントの大部分を取得します。

SELECT CONCAT('UNION ALL SELECT foreign_key_id, '
         ,column_name,', ',substr(column_name,2)
         ,' FROM denormalized_table ') AS stmt
  FROM information_schema.columns
 WHERE table_schema = 'mydatabasename'
   AND table_name = 'denormalized_table'
   AND column_name REGEXP '^[PD][0-9]+$'
 ORDER BY column_name

UNION ALLそこから出力を取得し、最初のものを.に置き換えINSERT INTO ...ます。これにより、変換全体を完了するために実行する単一のステートメントが得られます。

于 2013-02-04T19:25:37.140 に答える