sql - 这两个版本有什么区别
问题描述
下面给出的2个版本有什么区别?
Suppliers(sid:integer, sname:string, address:string)
Parts(pid:integer, pname:string, color:string)
Catalog(sid:integer, pid:integer, cost:real)
查找供应红色零件或绿色零件的供应商的 sid:
版本 1:
SELECT S.sid
FROM Suppliers S, Parts P, Catalog C
WHERE S.sid = C.sid AND P.pid = C.pid AND (P.color = 'red' OR P.color = 'green')
版本 2:
SELECT C.sid
FROM Parts P, Catalog C
WHERE P.pid = C.pid AND (P.color = 'red' OR P.color = 'green')
解决方案
第二个查询效率更高,因为它不带supplier
表(您不需要,因为您只需要sid
可以在parts
表中找到的供应商)。
但是我不认为它完全符合您的要求。如果供应商的目录中有多个红色或绿色部件,它将在结果集中出现多次。我建议改为聚合。
select c.sid
from parts p
inner join catalog c on c.pid = p.pid
where p.color in ('red', 'green')
group by s.id
请注意,此版本的查询使用标准的显式连接(使用on
关键字)而不是隐式连接(在from
子句中使用逗号):几十年前的这种语法使得编写、读取和维护查询变得更加困难,并且应该不能在新代码中使用。
推荐阅读
- php - 匹配 $_POST 键和 ACF 字段名称 (Wordpress)
- javascript - 与 json 混合的 Javascript 数组无法按预期工作
- sql - SQL 提取以特定字符开头的字符串
- wagtail - PageQuerySet 上的过滤(由 specific() 重新调整)在 Wagtail 中返回 FieldError
- python - 将 python 脚本编译为 C 时如何修复 Cython 标头错误
- angularjs - 无法从 Javascript 设置 Angular 模型
- blockchain - 如何限制某人在 1 个钱包中可以拥有的资产数量?
- apache-spark - 如果我们使用 newSession() 方法创建多个 Spark Session,多个 Spark 会话之间如何共享驱动程序内存
- python - 无法在 python3 和 ImportError 中导入 tensorflow:此包不应在 Python 3 上访问
- kotlin - 减少/收集`列表