2016-12-10 65 views
0

我正在將數據插入到輔助表中,它需要一個子查詢來計算並將滾動關閉值插入到新表中。當我嘗試查詢,我得到兩個錯誤之一:INSERT子查詢中的MySQL語法錯誤

  1. 無論是列數不匹配值計數或
  2. 語法錯誤

我已經驗證了目標表插入語句中引用了所有列。任何幫助,將不勝感激。

INSERT INTO `Historical`.`Secondary`(
`Record`, 
    `Symbol`, 
    `Date`, 
    `Open`, 
    `High`, 
    `Low`, 
    `Close`, 
    `Volume`, 
    `Rolling_Close`) 

SELECT 
T1.Date, T1.Symbol, T1.Close, 

(
SELECT AVG(T2.Close) 

FROM Historical.Primary T2 

WHERE T1.Symbol = T2.Symbol 

AND T2.Date BETWEEN DATE_SUB(T1.Date, INTERVAL 30 DAY) 

AND DATE_SUB(T1.Date, INTERVAL 1 DAY)) AS Rolling_Close 

FROM Historical.Primary T1 

GROUP BY T1.Date, 

T1.Symbol; 

表Historical.Secondary有以下欄目:

記錄,符號,日期,開盤價,最高價,最低價,收盤價卷,Rolling_Close

表Historical.Primary具有以下列:

記錄,符號,日期,開盤價,最高價,最低價,收盤價成交量

+1

1 - 你有選擇,你已經爲插件限定(相同數量的字段,他們必須要在同一訂單和正確的類型),2-你有一個懸掛。 3 - 缺少括號4可能其他您能否發佈樣本數據? –

+0

1.我驗證了九個列中的每一列在Historical.Secondary中都有一個可用的目標列,並按正確的順序匹配了名稱。 2.我不確定什麼是搖搖欲墜的意思。你能幫助我理解這一點,以及我可以採取哪些步驟來解決?該查詢不會運行,所以我的所有列的NULL都是NULL,所以我不知道應該發佈什麼類型的示例數據。感謝你目前的幫助。請讓我知道我還能提供什麼來幫助根源。我很新,所以我很感激耐心。 – Hogateer

+0

你正在插入9列,但只選擇4.我很困惑,關於什麼是次要的 - 它似乎是符號內的日期,但查詢是日期內的符號 - 你能澄清你想用次要實現什麼嗎? –

回答

0

假設你的表和數據與此類似

drop table if exists secondary; 
create table secondary (record int auto_increment primary key,symbol int,dt date,open int, high int, low int,close int,volume int, rolling_close decimal(10,2)); 

drop table if exists prmary; 
create table prmary (record int auto_increment primary key,symbol int,dt date,open int, high int, low int,close int,volume int); 

alter table prmary 
    add key k001(symbol,dt); 

MariaDB [sandbox]> select * from prmary order by symbol,record; 
+--------+--------+------------+------+------+------+-------+--------+ 
| record | symbol | dt   | open | high | low | close | volume | 
+--------+--------+------------+------+------+------+-------+--------+ 
|  1 | 707 | 2007-08-01 | NULL | NULL | NULL | 242 | NULL | 
|  3 | 707 | 2007-08-02 | NULL | NULL | NULL |  7 | NULL | 
|  5 | 707 | 2007-08-03 | NULL | NULL | NULL |  4 | NULL | 
|  7 | 707 | 2007-08-04 | NULL | NULL | NULL |  2 | NULL | 
|  2 | 712 | 2007-08-01 | NULL | NULL | NULL | 415 | NULL | 
|  4 | 712 | 2007-08-02 | NULL | NULL | NULL |  4 | NULL | 
|  6 | 712 | 2007-08-03 | NULL | NULL | NULL |  7 | NULL | 
|  8 | 712 | 2007-08-04 | NULL | NULL | NULL |  5 | NULL | 
+--------+--------+------------+------+------+------+-------+--------+ 
8 rows in set (0.00 sec) 

這個查詢

truncate table secondary; 
insert into secondary 
(`Record`, `Symbol`, `Dt`,`Open`, `High`, `Low`,`Close`,`Volume`,`Rolling_Close` 
) 
SELECT record,T1.Symbol, T1.Dt,open, high, low,t1.close,volume, 
(
SELECT avg(t2.close) 
FROM Prmary T2 
WHERE T1.Symbol = T2.Symbol 
AND T2.Dt BETWEEN DATE_SUB(T1.Dt, INTERVAL 30 day) 
AND DATE_SUB(T1.Dt, INTERVAL 0 day) 
) AS Rolling_Close 
FROM Prmary T1 
GROUP BY t1.symbol,t1.dt; 

產生這樣的結果

MariaDB [sandbox]> select * from secondary order by symbol, record; 
+--------+--------+------------+------+------+------+-------+--------+---------------+ 
| record | symbol | dt   | open | high | low | close | volume | rolling_close | 
+--------+--------+------------+------+------+------+-------+--------+---------------+ 
|  1 | 707 | 2007-08-01 | NULL | NULL | NULL | 242 | NULL |  242.00 | 
|  3 | 707 | 2007-08-02 | NULL | NULL | NULL |  7 | NULL |  124.50 | 
|  5 | 707 | 2007-08-03 | NULL | NULL | NULL |  4 | NULL |   84.33 | 
|  7 | 707 | 2007-08-04 | NULL | NULL | NULL |  2 | NULL |   63.75 | 
|  2 | 712 | 2007-08-01 | NULL | NULL | NULL | 415 | NULL |  415.00 | 
|  4 | 712 | 2007-08-02 | NULL | NULL | NULL |  4 | NULL |  209.50 | 
|  6 | 712 | 2007-08-03 | NULL | NULL | NULL |  7 | NULL |  142.00 | 
|  8 | 712 | 2007-08-04 | NULL | NULL | NULL |  5 | NULL |  107.75 | 
+--------+--------+------------+------+------+------+-------+--------+---------------+ 
8 rows in set (0.00 sec)