You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 16:03:24