混合显式和隐式连接失败,“有一个表的条目......但是它不能从查询的这一部分引用”

时间:2011-06-14 17:59:14

标签: sql postgresql

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行:... tegory c LEFT JOIN photos p ON p.referencekey = i.key WHER ...

     

提示:表“i”有一个条目,但不能从查询的这一部分引用它。

3 个答案:

答案 0 :(得分:30)

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中修复了这种行为,并且此查询将不再适用于此。

答案 1 :(得分:16)

将您的JOIN语句移到您要加入的表旁边:

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, 
      rooms r, 
      categories c 
   WHERE 
          i.room = r.key 
      AND r.key = 663308 
      AND i.sitekey = 32201 
      AND c.key = i.categorykey

长篇解释:

JOIN是导致源表的表达式的一部分,在FROM子句中用作from_item。您的FROM子句有3个 from_item 源表:

  • items
  • rooms
  • categories已加入photos

错误发生在ON加入categories from_item photos join_condition 中。您正在引用 from_item 中不存在的表items。解决方案是将photos联接移动到items from_item ,以便您拥有以下 from_item 源表:

  • items已加入photos
  • rooms
  • categories

可悲的是,我在文档中找不到一个示例,该示例清楚地表明FROM子句中的表与JOIN之间的关系。 SELECT Synopsis显示了这种语法,是文档中找到这种区别的最佳来源。请注意,JOIN不是FROM的兄弟条款,但实际上是FROM子句中 from_item 的一部分。因此,如果您的FROM子句由表列表组成,则该列表中的每个表都可以有自己的连接。然后,更加直观的是,连接中涉及的每个表必须包含在单个 from_item 中。

答案 2 :(得分:12)

由于你的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