MySQL UPDATE语句因子查询失败

时间:2014-02-25 14:13:16

标签: mysql stored-procedures sql-update

我有一些愚蠢的错误。我想使用这个存储过程语句更新一些表。

逻辑是:更新表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

你能看出问题出在哪里吗? 感谢。

更新

这个存储过程想要实现的是:

假设我有1个表,它是事务表,我想从特定参数生成结果。

SELECT bla bla bla使用此查询的结果:

 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语句中对应于另一个表的月份。

如何实现这个目标?

实际上是问题

1 个答案:

答案 0 :(得分: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您的查询是正确的。您已经将tt中的月份与子查询中的月份相关联:

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.bulan = mp.bulan