任何人都可以给我一个提示,为什么以下查询会引发语法错误?
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
答案 0 :(得分:0)
为什么以下查询会引发语法错误?
因为如果不存在内联视图,您就无法使其成为别名。
当您移除T4时,引擎只会看到()的操作顺序。当您添加别名时,它假定存在格式良好的内联视图,因此会查找不存在的正确语法(至少为SELECT和FROM)。
简单地说:
别名T4没有选择或来自;解决这个问题:
(
和结束) T4
(不需要)更详细
您的临时别名有效,因为它是一个完整而准确的查询,可以在其上运行。
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 1
或Query 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