命名temp-table上的SQL语法错误



任何人都可以给我一个提示,为什么以下查询会引发语法错误?

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 everthing是可以的。

我正在使用MySQL 5.5.47

为什么以下查询会引发语法错误?

因为如果不存在,则不能别名内联视图。

删除T4时,引擎只需查看()以进行操作。当您添加别名时,它假设存在一个形成良好的内联视图,从而寻找不存在的适当语法(至少选择)。

简单地说:

别名t4没有选择或来自;解决这个问题:

  • 添加它们
  • 删除初始(和结束) T4(不需要它们)
  • 重构SQL(为什么首先是直列视图?不需要。)

更多详细信息

您的温度别名有效,因为它是一个可以自行运行的完整而准确的查询。

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语句来生成结果集。如您所见,这缺少关键字"选择"one_answers"来自"。我想您可以消除左连接,但它会起作用,但我认为这不会达到所需的结果。

通过消除T4,引擎不会试图将()作为有效的SQL语句解析,而是将其视为()的操作顺序,并且既然()don''T在外部部分上的物质发动机不会感知语法错误。

具有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

最新更新