SQL连接,"有一个表的条目,但它不能被引用"

hse*_*bie 3 sql postgresql postgis

我有一个失败的SQL查询,给我错误:

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

通过查询,我需要所有3个表,但只有旅行和船只有匹配的ID才能加入.Test是一个shapefile,我需要执行一个postGIS函数,但它与其他两个没有相似的列id.

 select trips.*
 from trips, test
 inner join boats on boats.id = trips.boat_id
 where st_intersects(trips.geom, test.geom) and
 boats.uid = 44
Run Code Online (Sandbox Code Playgroud)

我认为它与join语句有关,但我真的不明白.我对这里发生的事情的解释非常感兴趣.

Gor*_*off 8

简单规则: 不要FROM子句中使用逗号. 始终使用显式JOIN语法...即使这意味着写出来CROSS JOIN.

正如评论中所提到的,编写查询的正确方法是:

 select trips.*
 from trips inner join
      test
      on st_intersects(trips.geom, test.geom) inner join
      boats
      on boats.id = trips.boat_id
 where boats.uid = 44;
Run Code Online (Sandbox Code Playgroud)

但是,问题是为什么这不起作用:

from trips,
     test inner join
     boats
     on boats.id = trips.boat_id
Run Code Online (Sandbox Code Playgroud)

首先,我想指出,MySQL 文档中比在Postgres文档中更好地描述了这种语法的失败:

但是,逗号运算符的优先级小于INNER JOIN,CROSS JOIN,LEFT JOIN等.如果在存在连接条件时将逗号连接与其他连接类型混合,则可能会出现'on子句'中未知列'col_name'形式的错误.有关处理此问题的信息将在本节后面给出.

我认为一种更简单的描述方式JOIN是操作符作用于其参数的表/表达式.逗号分隔参数.因此,第一个表格无法识别,因为逗号"阻止"它.

我想你可以用括号解决这个问题:

from (trips, test inner) join
     boats
     on boats.id = trips.boat_id
Run Code Online (Sandbox Code Playgroud)

你绝对可以使用CROSS JOIN以下方法解决它:

from trips cross join
     test inner join
     boats
     on boats.id = trips.boat_id
Run Code Online (Sandbox Code Playgroud)

但为什么要这么麻烦?有一种正确的方法来编写查询.