Oracle SQL:查询存在关联照片的文章编号与路径,该用HAVING还是AND条件?
Oracle SQL 关联存在性筛选实现说明
核心需求
查询两类业务字段:
- 存在对应照片记录的文章编号
artnr - 匹配到的图片存储路径
p.path
场景提醒:部分没有照片的文章,其关联字段值并非为NULL,无法靠简单的字段非空判断过滤无效数据。
常见选型疑问
写查询时容易纠结实现方式:
- 要靠
HAVING子句完成存在性筛选? - 还是直接在WHERE段加AND匹配条件实现需求?
实现逻辑说明
先看你当前写出的查询框架:
select a.artnr, p.path from article a, photo p where a.artnr = p.photo_nr having ...and ...(?);
这本质是隐式内连接的写法,本身就已经满足“仅返回关联表有匹配值的数据”的核心要求:
- 哪怕部分无照片的文章关联字段是非空值,只要在photo表找不到和它值相等的
photo_nr记录,内连接的等值匹配逻辑就会直接把这类无效文章过滤掉,根本不需要额外加判空或存在性判断。 - 完全没必要用
HAVING:这个子句的设计用途是给带GROUP BY的分组聚合查询做后置过滤,没有分组的场景下使用HAVING属于冗余写法,部分Oracle版本还会直接触发语法错误。
推荐规范写法
Oracle场景更推荐用可读性更强的显式JOIN写法,避免隐式连接带来的逻辑混淆:
SELECT a.artnr, p.path FROM article a INNER JOIN photo p ON a.artnr = p.photo_nr;
如果需要增加额外的业务筛选条件,直接在WHERE段加AND逻辑即可,不需要借助HAVING,比如:
SELECT a.artnr, p.path FROM article a INNER JOIN photo p ON a.artnr = p.photo_nr WHERE a.publish_status = 1; -- 直接加普通筛选条件即可
内容的提问来源于stack exchange,提问作者Baibs
相关产品推荐
相关产品推荐

