如何解决混合显式联接和隐式联接失败,显示为“存在表的条目…,但不能从查询的这一部分中引用它”
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中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。