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语句有关,但我真的不明白.我对这里发生的事情的解释非常感兴趣.
简单规则: 不要在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)
但为什么要这么麻烦?有一种正确的方法来编写查询.
归档时间: |
|
查看次数: |
7368 次 |
最近记录: |