簡體   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