2014-02-25 27 views
0

我有一些愚蠢的錯誤。我想用這個存儲過程語句更新一些表。MySQL更新聲明失敗的子查詢

邏輯是:更新表x其中最初來自select語句的行。

此存儲過程總是失敗:顯示

DELIMITER $$ 

USE `sre`$$ 

DROP PROCEDURE IF EXISTS `sp_generateGraphicsAcc`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_generateGraphicsAcc`(IN sa INT, IN thn VARCHAR(12), IN acc VARCHAR(12)) 
BEGIN 
/*tmp_totalpesan.type_m = 1*/ 
/*first, update tmp_totalpesan to empty row(s)*/ 
UPDATE tmp_totalpesan SET totalpesan = '' WHERE type_m = 1; 
/*second, update tmp_totalpesan from select statement.*/ 
UPDATE tmp_totalpesan tt 
    SET (tt.totalpesan = 
     SELECT COUNT(mp.quantity) 
     FROM mt_pesanan mp 
     WHERE (mp.ms_salesarea_idms_salesarea = sa) 
     AND (mp.tahun = thn) 
     AND (check_aksesoris_barang(mp.ms_langganan_idms_kodebarang) = acc) 
     AND tt.bulan = alter_monthname(MONTHNAME(mp.tgl_pesan)) 
    GROUP BY mp.bulan) 
WHERE type_m = 1;  
END$$ 

DELIMITER ; 

錯誤了

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(tt.totalpesan = SELECT COUNT(mp.quantity) FROM mt_pesanan mp WH' at line 8

你能看出問題出在哪裏? 謝謝。

UPDATE

這個存儲過程想達到的目標是:

讓說,我有1臺是事務表,我想生成特定參數的結果。

從SELECT唧唧歪歪使用此查詢的結果:

SELECT COUNT(mp.quantity), alter_monthname(MONTHNAME(tgl_pesan)) 
FROM mt_pesanan mp 
WHERE (mp.ms_salesarea_idms_salesarea = sa) 
AND (mp.tahun = thn) 
AND (check_aksesoris_barang(mp.ms_langganan_idms_kodebarang) = acc) 
GROUP BY mp.bulan; 

結果是

  • month - value
  • JANUARY - 1566
  • FEBRUARY - 800

等等...(12行)

我想要的是從結果中的select語句更新值(1566,800等)的第二個表。

相同的列名稱是與另一個表對應的select語句的月份。

如何實現這個?

實際問題

+0

你應該沒有'()'左右'SET'子句中的'column = value'。從'SET(tt.totalpesan = SELECT ....)'中刪除'()' –

+0

與mp有什麼關係? – Strawberry

+0

@MichaelBerkowski是的,它顯示了錯誤。我已經做到了。 – randytan

回答

1

你的括號不正確對齊。你的意思是?

UPDATE tmp_totalpesan tt 
    SET tt.totalpesan = 
     (SELECT COUNT(mp.quantity) 
     FROM mt_pesanan mp 
     WHERE (mp.ms_salesarea_idms_salesarea = sa) 
     AND (mp.tahun = thn) 
     AND (check_aksesoris_barang(mp.ms_langganan_idms_kodebarang) = acc) 
     AND tt.bulan = alter_monthname(MONTHNAME(mp.tgl_pesan)) 
     GROUP BY mp.bulan 
     ); 

我的問題是group by。這個子查詢可能會返回多行,這會產生錯誤。如果where子句選擇要彙總的行,則不需要group by。此外,通常使用名爲quantity的列,我期望sum()avg(),但不是count()。你確定count()是你真正想要的嗎?

編輯:

我覺得你的查詢是不正確的group by。然而

UPDATE tmp_totalpesan tt 
    SET tt.totalpesan = 
     (SELECT COUNT(mp.quantity) 
     FROM mt_pesanan mp 
     WHERE (mp.ms_salesarea_idms_salesarea = sa) 
     AND (mp.tahun = thn) 
     AND (check_aksesoris_barang(mp.ms_langganan_idms_kodebarang) = acc) 
     AND tt.bulan = alter_monthname(MONTHNAME(mp.tgl_pesan)) 
     ); 

,你可能要添加以下子查詢:您已經是一個月tt到月子查詢相關

tt.bulan = mp.bulan 
+0

是的問題是()。而且你也是對的,按功能分組是失敗的邏輯。我有一個問題,以更新table-X從列的源是在表Y. @戈登Linoff,請參閱UPDATED部分 – randytan

+0

我在哪裏放置'tt.bulan = mp.bulan'?在子查詢之外還是在子查詢本身之外? – randytan

+0

感謝您的回答。 :) – randytan