2015-02-17 49 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