sql - WHERE 不能在 Postgresql 中使用 INNER JOIN
问题描述
当我运行时:
SELECT * from actor inner join film_actor fa ON actor.actor_id = fa.actor_id
我得到结果。
但是运行:
SELECT * from actor inner join film_actor fa WHERE actor.actor_id = fa.actor_id
它给出了错误:
错误:“WHERE”处或附近的语法错误
据我了解,在这种情况下 WHERE 是正确的用法。
任何输入都会有所帮助。
解决方案
据我了解,在这种情况下 WHERE 是正确的用法。
不,你误解了这一点。
WHERE 子句出现在所有 JOIN 子句之后,它永远不能成为 JOIN条件的一部分。
JOIN 的一般格式是:
table_b JOIN table_b ON <some_condition>
那部分是WHERE
不允许的。唯一的变化是不同类型的连接(left join
, full join
, right join
)。连接始终遵循 FROM 子句。只有完全指定了所有连接(包括连接条件 using ON
),您才能开始编写WHERE
子句。
暂时忽略子查询和派生表,您可以将FROM
子句想象为“一件大事”,并且只有当它完成时才允许编写WHERE
子句。
也许您正在考虑古老、过时且脆弱的隐式连接:
SELECT *
from actor,
film_actor fa
WHERE actor.actor_id = fa.actor_id
但是JOIN
在子句中使用带有连接条件的显式运算符ON
是更好的编码风格。不要习惯于过时和古老的隐式连接。
推荐阅读
- docker - 如何在容器中加载 Docker 环境变量
- c# - 具有 JWT 授权的自定义中间件 - IsAuthenticated=False
- java - Quarkus 是针对 docker 容器运行时优化的还是仅针对 Kubernetes
- python-3.x - PyQt5 编码问题
- javascript - 如何使用 jquery 或 php 根据条件闪烁表行?
- javascript - 文件中的同时递增计数器
- javascript - GIPHY API 每次都返回相同的结果
- java - 如何判断电话是否响铃
- python - 提取每个音频文件的频谱图
- netlogo - 如何根据节点的入度创建链接?