混合显式联接和隐式联接失败,显示为“存在表的条目…,但不能从查询的这一部分中引用它”

问题描述

SELECT
      i.*,r.name AS roomname,c.name AS cat,p.key AS imgkey,p.extension AS imgext
   FROM 
      items i,rooms r,categories c 
         LEFT JOIN photos p 
            ON p.referencekey = i.key 
   WHERE 
          i.room = r.key 
      AND r.key = 663308 
      AND i.sitekey = 32201 
      AND c.key = i.categorykey
执行以上查询时返回以下错误。   错误:对表“ i”的FROM子句条目的引用无效      第1行:...程序c左联接照片p ON p.referencekey = i.key在哪里...      提示:表\“ i \”有一个条目,但是不能从查询的这一部分中引用它。     

解决方法

        由于您的Items.Room = Rooms.Key,所以我将其作为位置。
SELECT
      i.*,r.name AS roomname,c.name AS cat,p.key AS imgkey,p.extension AS imgext
   FROM 
      items i
         LEFT JOIN photos p 
            ON p.referencekey = i.key 
         JOIN rooms r
            on i.room = r.key
         JOIN categories c 
            on i.categorykey = c.key
   WHERE 
          i.sitekey = 32201 
      AND i.room = 663308 
    ,        SQL规范指出显式连接在隐式连接之前执行。这是一个隐式联接:
FROM table1 t1,table2 t2 WHERE t1.id=t2.t1id
这是一个显式联接:
FROM table1 t1 JOIN table2 t2 ON (t1.id=t2.t1id)
此代码位:
categories c 
     LEFT JOIN photos p 
        ON p.referencekey = i.key 
是显式联接,并且首先运行。请注意,这时该表已被别名,因为我尚未被查看,因此它尚不能加入。请注意,我相信MySQL在5.2中修复了此问题,并且该查询也将不再在那里工作。     ,        将
JOIN
语句移到要加入的表旁边:
SELECT
      i.*,p.extension AS imgext
   FROM 
      items i
         LEFT JOIN photos p 
            ON p.referencekey = i.key,rooms r,categories c 
   WHERE 
          i.room = r.key 
      AND r.key = 663308 
      AND i.sitekey = 32201 
      AND c.key = i.categorykey
详细的解释: ѭ5是表达式的一部分,该表达式生成源表,在in8ѭ子句中用作from_item。您的
FROM
子句具有3个from_item源表:
items
rooms
categories
加入了
photos
错误在于您的
categories
photos
from_item中的
ON
join_condition。您引用的表
items
在from_item中不存在。解决方案是将
photos
连接移到
items
from_item中,以便您具有以下from_item源表:
items
加入了
photos
rooms
categories
遗憾的是,我在文档中找不到一个示例来阐明
FROM
子句中的表与
JOIN
之间的关系。 ѭ26概要说明了此语法,并且是找到此区别的文档中的最佳来源。请注意,ѭ5不是
FROM
的兄弟子句,而是实际上
FROM
子句中from_item的一部分。因此,如果您的“ 8”子句包含一个表列表,则该列表中的每个表都可以具有自己的联接。这样就变得更加直观,联接中涉及的每个表都必须包含在单个from_item中。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...