2015-02-17 221 views
0

长时间用户,第一次发布海报。MySQL在Join语句中创建动态表名称

我有2个表;

a1_watchlists {ID(PK),姓名,日期}

a1_watchlist {ID(PK),watchlists_id(FK(a1_watchlists.id)),COMPANY_NAME,asx_code,日期}

我也有2000其他表已创建名称为'asx _'+ [asx_code](其中asx_code从另一个表中拉出)

此表看起来像; asx_ [asx_code] {日期(PK),开盘价,最高价,最低价,收盘价,成交量}

我想选择所有从a1_watchlists和a1_watchlist,然后使用值选择从asx_ [asx_code表的最后日期从a1_watchlist.asx_code生成表格名称的[asx_code]部分。

我遇到的问题是我希望使用a1_watchlist.asx_code中的值作为将字符串'asx_'添加到此表中的表名。

最近我已经能够得到是;

DECLARE @TableName VARCHAR(100) 
SELECT * 
FROM a1_watchlist AS wl 
JOIN a1_watchlists AS wls 
    ON wls.id = wl.watchlists_id 
    SET @TableName = 'asx_' + wl.asx_code 
INNER JOIN (SELECT MAX(date),open,high,low,close,volume,amount_change,percent_change FROM @TableName) 

目前这给了错误:

1064 - 你在你的SQL语法错误;检查对应于你的MySQL服务器版本使用附近的正确语法手册“声明@tablename VARCHAR(100)

SELECT * 
FROM a1_watchlist AS wl 
' at line 1 

预期colums我需要在最终的结果将是:

WL。 ID,wl.watchlists_id,wl.company_name,wl.asx_code,asx_ [asx_code] .date,asx_ [asx_code]。开,asx_ [asx_code]。高,asx_ [asx_code]。低,asx_ [asx_code] .close,asx_ [asx_code] .volume

如果您需要更多信息,请告知我。

回答

1

我不打算说在2000+表格以asx +一些代码开始的情况下(我住在一个有多个桥梁的小镇)的情况下该怎么办,或者甚至不管你是什么做是最好的方式去你想去的地方。但是,它看起来像你试图连接在一起的事情,并创建一个动态的声明。如果这听起来不错,那么我建议你看看准备好的陈述。如下所示。希望这可以帮助。

DELIMITER $$ 
DROP PROCEDURE IF EXISTS prRetrieveAllFromTable$$ 
CREATE PROCEDURE prRetrieveAllFromTable(tableName VARCHAR(64)) 
BEGIN 

SET @s = CONCAT('SELECT * FROM ',tableName); 
PREPARE stmt FROM @s; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

END$$ 

DELIMITER ; 
CALL prRetrieveAllFromTable('calendar'); 

http://dev.mysql.com/doc/refman/5.5/en/sql-syntax-prepared-statements.html

How To have Dynamic SQL in MySQL Stored Procedure

+0

干杯的响应Voidmain,看起来你明白正是我试图实现一个表名的CONCAT其中名字的一部分来自的领域现有的表格。 我不完全确定我正在做的是对MySQL很新的正确方法。如果不是有2000个表格,而是将它们放到1个表格中,那么我将在1个表格中制作大约700万行,每天将增加2000行,而不是像单张表格那样增加3500个,就像我现在每天增长1行一样。 我会尝试你今晚提供的东西 – CassOwary 2015-02-18 04:12:57