簡體   English   中英

命名臨時表上的SQL語法錯誤

[英]SQL Syntax error on named temp-table

誰能給我一個提示,為什么以下查詢引發語法錯誤?

SELECT *  
  FROM 
     (
       ( SELECT cu.ID id
              , name
              , ego_id
              , u.fb_id 
           FROM contact_users cu 
           JOIN users u 
             ON cu.ego_id = u.ID
       ) temp 
    LEFT 
    JOIN fb_user 
      ON temp.fb_id = fb_user.user_fb_id
     ) T4

ERROR 1064 (42000): 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 'T4'...

如果我刪除T4一切都很好。

我正在使用MySQL 5.5.47

為什么以下查詢引發語法錯誤?

因為如果一個內聯視圖不存在,則無法為它命名。

卸下T4時,引擎只會看到()的操作順序。 當您添加別名時,它假定存在格式正確的內聯視圖,因此將查找不存在的正確語法(至少是SELECT和FROM)。

簡單地說:

別名T4沒有選擇或從; 解決此問題:

  • 添加他們
  • 刪除初始(和結尾) T4 (不需要)
  • 重構SQL(為什么首先要有內聯視圖?不需要它。)

更多詳情

您的Temp別名之所以有效,是因為它是一個完整而准確的查詢,可以單獨運行。

SELECT cu.ID id
              , name
              , ego_id
              , u.fb_id 
           FROM contact_users cu 
           JOIN users u 
             ON cu.ego_id = u.ID

在哪里:

( SELECT cu.ID id
          , name
          , ego_id
          , u.fb_id 
  FROM contact_users cu 
  JOIN users u 
    ON cu.ego_id = u.ID
) temp 
LEFT 
JOIN fb_user 
  ON temp.fb_id = fb_user.user_fb_id

不是完整而准確的SQL語句來生成結果集。 如您所見,這缺少關鍵字“ SELECT”和“ FROM”。 我想您可以消除左連接,它會起作用,但我認為這樣做不會達到預期的結果。

通過消除T4,引擎不會嘗試將()之間的數據解析為有效的SQL語句,而是僅將()視為操作順序,因為()無關緊要引擎的外部看不到語法錯誤。

Query 1Query 2

查詢1

SELECT * 
FROM 
    (
        SELECT * 
        FROM 
            (
                SELECT cu.ID as id, name, ego_id, u.fb_id 
                FROM contact_users as cu 
                JOIN users as u 
                 ON cu.ego_id = u.ID
            ) temp 
        LEFT OUTER JOIN fb_user 
            ON temp.fb_id = fb_user.user_fb_id
    ) T4

查詢2

SELECT cu.ID as id, name, ego_id, u.fb_id, fb_user.* 
FROM contact_users as cu 
JOIN users as u 
 ON cu.ego_id = u.ID 
LEFT OUTER JOIN fb_user 
 ON u.fb_id = fb_user.user_fb_id

我更喜歡查詢2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM