【发布时间】:2019-10-13 19:55:14
【问题描述】:
我想创建一个 MYSQL 存储过程,它动态地用 TABLE_MASTERTABLE_EXAMPLE 的 列名 /strong> -> 预期结果显示在 TABLE_RESULT 上。
以下是表格内容:
TABLE_EXAMPLE (THE HEADERS MIGHT CHANGE BUT THEY ARE MAPPED WITH A COLUMN IN TABLE_EXAMPLE):
|header01 | header02|...|header n|
|data01 ..| data02..|...|data 0n|
|data11 ..| data12..|...|data 1n|
..........etc.................
|data n1..|data n2..|...|data nn|
TABLE_MASTER (STATIC TABLE, UNCHANGED):
|ORIGIN| TARGET| NAME|
|header01|header_master01|Paul|
|header02|header_master02|Paul|
..........etc.................
|header n|header_master n|Paul|
预期结果包含来自 TABLE_EXAMPLE 的数据,但具有通过 TABLE_MASTER.TARGET 找到的映射列名称:
TABLE_RESULT:
|data_master01|data_master02|...|data_master0n| NAME|
|data01.......|data02.......|...|data 0n.......|Paul|
|data11.......|data12.......|...|data 1n.......|Paul|
.........................etc.........................
|data n1..|data n2...........|...|data nn.......|Paul|
PS:一个简单的:“ALTER TABLE table_example CHANGE COLUMN old new char(250)”,是不行的。
感谢您的帮助!
编辑 1:我试图写这个但没有成功,因为 'oldname' 和 'newname' 不被视为变量。
BEGIN
DECLARE n INT(10) ; DECLARE i INT(10) ;
DECLARE oldname VARCHAR(40); DECLARE newname VARCHAR(40);
SET n=(SELECT count(id) FROM `master_table` where `name`='paul');
SET i=1; WHILE i<n DO
SET oldname=(SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE
`TABLE_SCHEMA`='mydb'AND `TABLE_NAME`='table_example' LIMIT 1, 1) ;
SET newname=(SELECT TARGET FROM MASTER_TABLE WHERE ORIGIN='oldname');
ALTER TABLE `table_example` CHANGE oldname newname VARCHAR(50) NOT NULL;
SET i=i+1 ; END WHILE ;
END
【问题讨论】:
-
什么是表头?列名?你应该重新考虑你的数据库结构,因为你不应该把数据和列名混在一起。
-
是的 - 表头是列名。我正是想用另一个表格内容的标题创建一个新表格。 PS: header01 |页眉02|值可能会有所不同,具体取决于我要规范化的 table_example。
-
您不应该将数据与数据库结构混合。如果你描述了你想用这个实现什么,你可能会得到一个更好的结构的建议。
-
您是在问如何使用
AS定义查询的列别名?你上面的问题不清楚。示例表和主表如何形成预期结果? -
@BillKarwin :好点,我刚刚在我的问题中添加了预期结果和之前表格之间的链接/推理。