2012-10-13 28 views
3

我有一个“TableOriginal”,我想“拆分”成多个表,每一个与名称不同值的相比,可以发现上“split”栏中的“tableOriginal”。因此,这个名称必须是动态的(可能由前一个查询的结果变量形成)。分解表与动态表名称分配新的多个表

TableOriginal:

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

+0

SQL小提琴现在回来了。对不起'回合! –

+0

由于对@AbdiasSoftare的评论部分隐藏,我在这里发布给定答案的原因几乎在那里,但并未真正关闭:我现在需要现在基于“SELECT split FROM TableOriginal GROUP BY”动态获取“A,B,C”拆分“,并将每个返回的值作为变量循环使用(有点”用于“循环),使用@AbdiasSoftare代码。 – kairos

回答

2

你或许可以使用VIEW这一点。对于动态方法,请参阅VIEW的TEMPTABLE参数。

在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

UPDATE:(基于下面的评论)

我个人由STORE-NOP原则:-P工作使用一个数据库只能存储回收 - 不可─换处理(TM),所以我会做在两个步骤:

select distinct split from TableOriginal; 

然后经过每个结果和在一个预先定义的查询注入的结果(通知{0}的串中,这些将是以后换掉 - 也许在这个时候会有所不同您正在使用e语言):

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。

+0

我无法找到有点“循环”地址到@tablename每个GROUP BY的值... – kairos

+0

我看不到您在哪里使用group by或@tablename在哪里? – K3N

+0

要得到一列只有一列的结果('A','B','C')。错误的方法? :)鉴于TableOriginal我首先需要提取这些值,然后,使用它们来创建表CONCAT(“TableSplit _”,@ tablename),插入... – kairos