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

时间:2016-12-09 15:57:23

标签: mysql 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,那么就可以了。

我正在使用MySQL 5.5.47

2 个答案:

答案 0 :(得分:0)

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

因为如果不存在内联视图,您就无法使其成为别名。

当您移除T4时,引擎只会看到()的操作顺序。当您添加别名时,它假定存在格式良好的内联视图,因此会查找不存在的正确语法(至少为SELECT和FROM)。

简单地说:

别名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语句。正如您所看到的那样,缺少关键字' SELECT'和' FROM'。我想你可以消除左连接,它会起作用,但我不认为这会产生预期效果。

通过消除T4,引擎不会尝试将()之间的数据解析为有效的SQL语句,而只是看到()' s作为操作顺序,并且因为()在外部部分不重要,所以引擎不会察觉到语法错误。

答案 1 :(得分:-1)

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