繁体   English   中英

MySQL过程语法错误与创建表语句

[英]MySQL procedure syntax error with create table statement

下面的代码无需使用create table语句即可完美运行。 我已经花了一个小时来查看这段简单的代码以查找错误。

DELIMITER $$

    USE `operations`$$

    DROP PROCEDURE IF EXISTS `rc_pending_data_tat_proc`$$

    CREATE PROCEDURE `rc_pending_data_tat_proc`()
    BEGIN
    (
    CREATE TABLE rc_pending_tat_temp /*works fine when I remove this*/

    SELECT IF(b.retailer IS NULL,a.retailer, b.retailer) AS Retailer,
     (CASE
     WHEN DATEDIFF(criteria_date,transaction_date)<=50
     THEN '<=50'
     WHEN DATEDIFF(criteria_date,transaction_date) <=70
     THEN '<=70'
     WHEN DATEDIFF(criteria_date,transaction_date) <=80
     THEN '<=80'
     WHEN DATEDIFF(criteria_date,transaction_date) <=90
     THEN '<=90'
     ELSE 
     '>90'
     END) AS Pending_since
     , COUNT(*) AS `count`, CURRENT_TIMESTAMP AS `date`
      FROM `rc_pending_data` a
      LEFT JOIN `rc_store_retailer_mapping` b
      ON a.retailer=b.store_name
    GROUP BY 1,2
    );
        END$$

    DELIMITER ;

它给出的错误是相当标准的,即

错误代码:1064您的SQL语法错误; 检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在“创建表rc_pending_tat_temp SELECT IF(b.retailer IS NULL,a.retailer,b.ret''在第4行附近)附近使用

请删除存储过程的GROUP BY 1,2部分之后的“( BEGIN之后的“和”)。 我尝试此操作时没有括号的开头和结尾,并且对我有用。

在我看来,SQL不喜欢您的查询试图创建一个空表的事实。

我只是四处搜寻,以找出是否可以创建没有任何列的表,而且看起来这通常不是一件容易的事。 如果您出于某些特定原因要创建一个空表,则似乎是另一回事。 但是,如果要解决此问题,请在表中至少添加一列。 像这样:

CREATE TABLE rc_pending_tat_temp(Id INT);

那应该使您的查询运行。

编辑:

听起来您想创建一个新表来存储SELECT语句的结果。 为此,请在此处检查SELECT INTO语句的语法。 这样您就可以根据SELECT语句的结果创建一个表。

在这种情况下,您应该删除以下行:

CREATE TABLE rc_pending_tat_temp

然后添加:

INTO rc_pending_tat_temp

因此,您的查询最终应如下所示:

DELIMITER $$

    USE `operations`$$

    DROP PROCEDURE IF EXISTS `rc_pending_data_tat_proc`$$

    CREATE PROCEDURE `rc_pending_data_tat_proc`()
    BEGIN
    (
        SELECT IF(b.retailer IS NULL,a.retailer, b.retailer) AS Retailer,
         (CASE
         WHEN DATEDIFF(criteria_date,transaction_date)<=50
         THEN '<=50'
         WHEN DATEDIFF(criteria_date,transaction_date) <=70
         THEN '<=70'
         WHEN DATEDIFF(criteria_date,transaction_date) <=80
         THEN '<=80'
         WHEN DATEDIFF(criteria_date,transaction_date) <=90
         THEN '<=90'
         ELSE 
         '>90'
         END) AS Pending_since
     , COUNT(*) AS `count`, CURRENT_TIMESTAMP AS `date`
      INTO rc_pending_tat_temp
      FROM `rc_pending_data` a
      LEFT JOIN `rc_store_retailer_mapping` b
      ON a.retailer=b.store_name
      GROUP BY 1,2
    );
    END$$

DELIMITER ;

嗨,我是通过很好的旧尝试方法找到了这个问题,原来那些多余的括号()引起了语法错误。 删除它们,代码就像魅力一样工作!

DELIMITER $$

    USE `operations`$$

    DROP PROCEDURE IF EXISTS `rc_pending_data_tat_proc`$$

    CREATE PROCEDURE `rc_pending_data_tat_proc`()
    BEGIN
    (
    CREATE TABLE rc_pending_tat_temp /*works fine when I remove this*/

    SELECT IF(b.retailer IS NULL,a.retailer, b.retailer) AS Retailer,
     (CASE
     WHEN DATEDIFF(criteria_date,transaction_date)<=50
     THEN '<=50'
     WHEN DATEDIFF(criteria_date,transaction_date) <=70
     THEN '<=70'
     WHEN DATEDIFF(criteria_date,transaction_date) <=80
     THEN '<=80'
     WHEN DATEDIFF(criteria_date,transaction_date) <=90
     THEN '<=90'
     ELSE 
     '>90'
     END) AS Pending_since
     , COUNT(*) AS `count`, CURRENT_TIMESTAMP AS `date`
      FROM `rc_pending_data` a
      LEFT JOIN `rc_store_retailer_mapping` b
      ON a.retailer=b.store_name
    GROUP BY 1,2
    );
        END$$

    DELIMITER ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM