3

複数のテーブルに「分割」したい「TableOriginal 」があります。それぞれのテーブルには、「 tableOriginal 」の「 split」列で見つかるよりも異なる値の名前が付いています。したがって、名前は動的でなければなりません (おそらく、前のクエリの結果である変数によって形成されます)。

テーブルオリジナル:

+----+-------+-------+
| id | split | value |
+----+-------+-------+
| 1  |   A   |  v1   |
| 2  |   A   |  v2   |
| 3  |   A   |  v3   |
| 4  |   B   |  v4   |
| 5  |   B   |  v5   |
| 6  |   B   |  v6   |
| 7  |   C   |  v7   |
| 8  |   C   |  v8   |
| 9  |   A   |  v9   |
| 10 |   B   |  v10  |
| 11 |   B   |  v11  |
| 12 |   C   |  v12  |
+----+-------+-------+

TableSplit_A

+----+-------------+-------+
| id | original_id | value |
+----+-------------+-------+
| 1  |      1      |  v1   |
| 2  |      2      |  v2   |
| 3  |      3      |  v3   |
| 4  |      9      |  v9   |
+----+-------------+-------+

TableSplit_B

+----+-------------+-------+
| id | original_id | value |
+----+-------------+-------+
| 1  |      4      |  v4   |
| 2  |      5      |  v5   |
| 3  |      6      |  v6   |
| 4  |      10     |  v10  |
| 5  |      11     |  v11  |
+----+-------------+-------+

TableSplit_C

+----+-------------+-------+
| id | original_id | value |
+----+-------------+-------+
| 1  |      7      |  v7   |
| 2  |      8      |  v8   |
| 3  |      12     |  v12  |
+----+-------------+-------+

SQLフィドル:

http://sqlfiddle.com/#!2/61266

4

1 に答える 1

2

これにはおそらくVIEWを使用できます。動的なアプローチについてはTEMPTABLE、VIEW の引数を参照してください。

次に、VIEW の Create クエリで、列名にエイリアスを使用します。

私の意見では、関連するダイナミクスは、サーバー上のプロシージャではなく、コードで処理する必要があります。とにかく、ここに例があります:

CREATE ALGORITHM=UNDEFINED 
DEFINER=`user`@`yourserver` 
SQL SECURITY DEFINER 
VIEW `tableA` AS select `tableoriginal`.`id` AS `id`,
     `tableoriginal`.`split` AS `tableoriginal_A`,
     `tableoriginal`.`value` AS `value` 
from 
     `tableoriginal` 
where
     (`tableoriginal`.`split` = 'A')

TableAこれで、他のテーブルと同じようにクエリを実行できます(TEMPTABLEこの例ではスキップしました)。

これがあなたが探しているものに関連していることを願っています.

フィドラーに追加: http://sqlfiddle.com/#!2/c4304/1

更新:(以下のコメントに基づく)

個人的に私は STORE-NOP の原則に従って作業しています:-P は、STOre-REtrieve-NOT-for-Processing (tm) にのみデータベースを使用するため、2 つの手順で行います。

select distinct split from TableOriginal;

次に、各結果を調べて、定義済みのクエリに結果を挿入します (文字列内の {0} に注意してください。これらは後で置き換えられます。使用している言語によって異なる可能性があります)。

myView = "CREATE ALGORITHM=UNDEFINED 
SQL SECURITY DEFINER 
VIEW `table{0}` AS select `tableoriginal`.`id` AS `id`,
     `tableoriginal`.`split` AS `tableoriginal_{0}`,
     `tableoriginal`.`value` AS `value` 
from 
     `tableoriginal` 
where
     (`tableoriginal`.`split` = '{0}')
;"

次に、結果の各行に対してクエリを実行します (VB の疑似コード)。

For Each line In DBQueryResult
  cmd.ExecuteWrite(String.Format(myView, line.field("split"))
Next

これらが有効なステートメントであるかどうかを今すぐ確認することはできませんが、疑似コードとして意図されているため、使用している言語でこれを行う方法を理解できます。

また、最終クエリで IF EXIST/DROP VIEW または TEMPTABLE を使用することを検討することもできます。

于 2012-10-14T11:55:05.573 に答える