2016-08-30 56 views
0

下面的代码在没有创建表语句的情况下完美工作。我花了一个小时只看这段简单的代码来发现一个错误。创建表语句引起的MySQL过程语法错误

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行

回答

1

请删除BEGIN和“)”后的“(”)GROUP BY 1,2您的存储过程的一部分。我在没有开始和结束括号的情况下尝试了这一点,它为我工作。

+0

嗨尼廷,感谢您的帮助。通过点击和尝试方法来消除错误,这就是它! –

0

它看起来对我来说,就像SQL不喜欢你的查询试图创建一个空表的事实。

我只是搜索一下,看看你是否可以创建一个没有任何列的表,它看起来不是一般的如果你想为某些特定的原因创建一个空表,但是如果你想解决这个问题,至少在你的表中添加一列,例如:

CREATE TABLE rc_pending_tat_temp(Id INT); 

这应该让您的查询运行。

编辑:

听起来像是你想创建一个新的表来存储您的SELECT语句的结果。为此,请查看SELECT INTO语句here的语法。这将允许您根据您的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 ; 
+0

嗨Malcom,我通过在create table语句下面使用select语句向表中添加一列。我无法理解这个错误背后的原因。 –

+0

@RahulChawla看起来你可能正在寻找SELECT INTO语法。看看这个链接:[链接](http://www.w3schools.com/sql/sql_select_into.asp)我会用一个例子为这个答案添加一个单独的例子。 –

0

嗨我发现了良好的老打击和尝试方法的问题,原来那些额外括号()导致语法错误。删除他们和代码工作像魅力!

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 ;