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

Uma*_* A. 32 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
Run Code Online (Sandbox Code Playgroud)

执行时上面的查询返回以下错误.

错误:对表"i"的FROM子句条目的无效引用

第1行:... tegory c LEFT JOIN photos p ON p.referencekey = i.key WHER ...

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

Sco*_*owe 35

SQL规范声明在隐式连接之前执行显式连接.这是一个隐式连接:

FROM table1 t1, table2 t2 WHERE t1.id=t2.t1id
Run Code Online (Sandbox Code Playgroud)

这是一个显式连接:

FROM table1 t1 JOIN table2 t2 ON (t1.id=t2.t1id)
Run Code Online (Sandbox Code Playgroud)

这个代码位:

categories c 
     LEFT JOIN photos p 
        ON p.referencekey = i.key 
Run Code Online (Sandbox Code Playgroud)

是一个显式连接,并首先运行.请注意,此时表格别名,因为我尚未查看,因此它尚未加入.请注意,我认为MySQL在5.2中修复了这种行为,并且此查询将不再适用于此.


gil*_*ly3 17

将您的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
Run Code Online (Sandbox Code Playgroud)

长篇解释:

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

  • items
  • rooms
  • categories 加入了 photos

错误发生在您加入from_itemON join_condition中.您正在引用from_item中不存在的.解决方案是将连接移动到from_item,以便您拥有以下from_item源表:categoriesphotos itemsphotositems

  • items 加入了 photos
  • rooms
  • categories

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

  • 很棒的解释.虽然接受的答案提供了一个可以说是更明智的解决方案,但是这个解决了问题的核心(JOIN子句与FROM子句中紧接在其之前的表相关联). (2认同)

DRa*_*app 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 
Run Code Online (Sandbox Code Playgroud)