gpt4 book ai didi

mysql - 使用动态表名分配将表拆分为新的多个表

转载 作者:可可西里 更新时间:2023-11-01 08:35:44 27 4
gpt4 key购买 nike

我有一个“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

最佳答案

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

然后在 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)。

希望这与您所寻找的内容有关。

添加到 fiddler : http://sqlfiddle.com/#!2/c4304/1

更新:(基于下面的评论)

我个人按照 STORE-NOP 原则工作:-P 仅将数据库用于 STOre-REtrieve-NOt-for-Processing (tm),因此我将分两步进行:

select distinct split from TableOriginal;

然后遍历每个结果并将结果注入(inject)预定义的查询(注意字符串中的 {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。

关于mysql - 使用动态表名分配将表拆分为新的多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12877234/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com