MySQL在Join语句中创建动态表名

时间:2015-02-17 22:14:41

标签: mysql sql

长时间用户,第一次海报。

我有两张桌子;

a1_watchlists {id(PK),name,date}

a1_watchlist {id(PK),watchlists_id(FK(a1_watchlists.id)),company_name,asx_code,date}

我还有2000个其他表格,这些表格的名称是' asx _' + [asx_code](其中asx_code是从另一个表中提取的)

这张桌子看起来像; asx_ [asx_code] {date(PK),open,high,low,close,volume}

我想从a1_watchlists和a1_watchlist中选择所有内容,然后使用a1_watchlist.asx_code中的值从asx_ [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服务器版本对应的手册,以便在#DEC; DECLARE @TableName VARCHAR(100)附近使用正确的语法

SELECT *
FROM a1_watchlist AS wl
' at line 1

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

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 个答案:

答案 0 :(得分:1)

如果你有2000多张桌子以asx +一些代码开头......(我住在一座有多座桥梁的小镇),甚至不管你是什么,我都不会谈论该怎么办? 39;重新做是最好的方式去你想去的地方。但是,它确实看起来像是在尝试将事物连接在一起并创建动态语句。如果这听起来是正确的,那么我建议您查看准备好的陈述。如下所示。希望这会有所帮助。

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