PL/SQL中当视图A无结果时如何从视图B获取对应值
解决思路与正确SQL实现
你的原SQL语句问题在于使用了隐式笛卡尔积(FROM A a, B b),这会将A和B的所有行进行全量关联,生成大量冗余数据,根本无法实现“优先取A的记录,A无结果时取B”的需求。
以下是两种符合需求的实现方式:
方式一:使用UNION ALL + NOT EXISTS(推荐)
这种方式逻辑清晰,性能更优,先从A获取目标记录,若A无匹配,再从B中获取且确保A中不存在该记录:
SELECT Inquiry_no, Revision_no, Total FROM A WHERE Inquiry_no = 1 -- 替换为你要查询的Inquiry_no值 UNION ALL SELECT Inquiry_no, Revision_no, Total FROM B WHERE Inquiry_no = 1 AND NOT EXISTS ( SELECT 1 FROM A WHERE A.Inquiry_no = B.Inquiry_no )
- 当查询
Inquiry_no=1时,A有匹配记录,直接返回A的行; - 当查询
Inquiry_no=100时,A无匹配,B有且A中不存在该记录,返回B的行; - 当查询
Inquiry_no=11时,A和B都无匹配,返回空结果。
方式二:使用左连接 + COALESCE
通过左连接关联A和B的目标记录,用COALESCE优先取A的字段值:
SELECT COALESCE(a.Inquiry_no, b.Inquiry_no) AS Inquiry_no, COALESCE(a.Revision_no, b.Revision_no) AS Revision_no, COALESCE(a.Total, b.Total) AS Total FROM (SELECT * FROM A WHERE Inquiry_no = 1) a LEFT JOIN (SELECT * FROM B WHERE Inquiry_no = 1) b ON a.Inquiry_no = b.Inquiry_no WHERE a.Inquiry_no IS NOT NULL OR b.Inquiry_no IS NOT NULL
这个方式会先筛选A和B中目标Inquiry_no的记录,左连接后用COALESCE选择非空的字段值,最后过滤掉两边都无数据的情况。
内容的提问来源于stack exchange,提问作者Asanka Maduranga
相关产品推荐
相关产品推荐

