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  |
+----+-------------+-------+

SQLFiddle:

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

4

1 回答 1

2

您可能可以为此使用VIEW 。对于动态方法,请参见TEMPTABLEVIEW 的论点。

然后,在 VIEW 的创建查询中,您使用别名作为列名。

在我看来,相关的动态应该在代码中而不是在服务器上的过程中处理。无论如何,这是一个例子:

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),因此我将分两步进行:

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 回答