Oracle SQL如何合并两表并保留全部匹配与不匹配记录
问题原因
你当前的SQL使用逗号分隔两张表、再加等值WHERE条件的写法,本质是内连接,仅会保留两张表type_s字段完全匹配的记录。表1中roadside类型在表2没有对应数据,因此查询结果中该条记录被过滤。
修改方案
- 将内连接替换为左外连接,以处理后的表1数据(DD子查询)作为左表,完整保留表1的所有记录
- 使用Oracle内置
NVL()函数,将左外连接产生的CNT空值替换为0 - 若业务逻辑需要按日期+类型双维度关联,可在关联条件中补充日期匹配规则,避免跨日期数据错误关联
调整后的完整代码
with t2 as (select DATE_TIME , type_s, calls, declines from table_1 ), CD as ( SELECT DATE_TIME, type_s, CNT FROM table2 ), DD AS( SELECT TO_DATE(current_date - 1) AS chart_date, type_s, calls, declines FROM t2), GG As ( SELECT DD.chart_date , DD.type_s, DD.calls, DD.declines, NVL(CD.CNT, 0) AS CNT FROM DD LEFT JOIN CD ON CD.type_s = DD.type_s -- 如需按日期匹配,可取消下一行注释 -- AND CD.DATE_TIME = DD.chart_date ) select CHART_DATE,type_s,calls,declines,cnt from GG;
内容的提问来源于stack exchange,提问作者mali_the
相关产品推荐
相关产品推荐

