sql - 当查询限制来自另一个没有连接的表时,我可以从一个表中选择一个值吗?
问题描述
我的模型有 3 个表:ACTORS、MOVIES和MOVIE_CAST,代表 ACTORS 和 MOVIES 之间的关系。
表:演员
- 列:姓名、出生年份
- 主键:姓名、Birth_Year
表:电影
- 列:标题、Release_Year、类型、导演
- 主键:标题、Release_Year
表:MOVIE_CAST
- 列:电影 (FK)、Movie_Release_Year (FK)、演员 (FK)、Birth_Yearh (FK)
我需要列出所有由“韦斯·安德森”导演的电影的演员和他们的出生年份。
我尝试了 2 个不同的查询:第一个我没有加入表格,第二个我做了。两者都给了我相同的结果,但我不确定哪个是正确的。
第一个查询:
SELECT DISTINCT A.NAME, A.BIRTH_YEAR
FROM ACTORS A, MOVIES M
WHERE M.DIRECTOR = 'Wes Anderson'
第二个查询:
SELECT DISTINCT A.NAME, A.BIRTH_YEAR
FROM ACTORS A
JOIN MOVIE_CAST MC ON MC.ACTOR = A.NAME AND MC.BIRTH_YEAR = A.BIRTH_YEAR
JOIN MOVIES M ON M.TITLE = MC.MOVIE AND M.RELEASE_YEAR = MC.MOVIE_RELEASE_YEAR
WHERE M.DIRECTOR = 'Wes Anderson'
哪个查询是正确的?
PS:顺便说一下,我正在使用 PostgreSQL/pgAdmin4 数据库。
解决方案
第二个查询是“正确的”。
在第一个查询中,您已经形成了一个“笛卡尔积”(将演员表中的每一行乘以电影表中的行数),这就是为什么您需要使用SELECT DISTINCT
来减少返回的行数。这是一种低效的方法。
推荐阅读
- database - 机器学习或深度学习用于 SAT 分数预测?
- ios - 某些 iPhone 设备上不显示谷歌地图内容(使用 swift)?
- python-3.x - Windows 上的 TensorFlow-GPU 1.12.0 + CUDA 9 + cuDNN 7.41 引发 DLL 加载失败。相同的捆绑包适用于 Ubuntu
- php - 为 PHP 脚本的 POST 请求创建任务以在 MySQL 数据库中添加条目
- linq - 如何按日期字符串从 cosmos db 顺序返回查询?
- ssl - HAProxy 如何管理 IP 地址上的证书?
- java - 将 Scala 条件转换为 Java 谓词
- javascript - 如何修复我的购物卡的增减值?
- sublimetext3 - 如何为 sublime text 3 上下文菜单分配范围?
- jquery-selectors - 如何使用 Cheerio 访问包含不同属性值的 DOM 属性?