Oracle内连接返回错误结果集:单表与多表连接结果数量不符
为什么两次内连同一张表后查询结果集远超预期?
兄弟,你这问题太典型了——**笛卡尔积(Cartesian Product)**在背后搞事情!咱们一步步拆解原因,再给你解决办法:
问题根源:两次独立连接触发了笛卡尔积
你单表查询OA_SERVICE_REQUESTS得到10条数据,这完全正常。但你连续两次内连ELVM_SMUNT_CUS表,而且是分别用DIVCOD和UNTNUM做关联条件,这就相当于:
- 第一次连接时,每条原始记录会匹配
ELVM_SMUNT_CUS中所有DIVCOD相同的记录 - 第二次连接时,又会把第一次连接后的结果,再和
ELVM_SMUNT_CUS中所有UNTNUM相同的记录做交叉匹配
举个直观的例子:假设某条OA_SERVICE_REQUESTS记录的DIVCOD在ELVM_SMUNT_CUS里有3条匹配,UNTNUM有4条匹配,那这条记录经过两次连接后就会变成 3×4=12 条重复数据。10条原始记录,平均每条产生12条结果,刚好就是你看到的120条!
解决办法:两种思路按需选择
方案1:单次内连接同时匹配两个关联字段(最优解)
如果你的需求是从ELVM_SMUNT_CUS中获取同时匹配DIVCOD和UNTNUM的记录,那直接把两个关联条件合并到一次内连接里,这样就能避免笛卡尔积,每条原始记录只会匹配符合双条件的对应记录:
select * from OA_SERVICE_REQUESTS inner join ELVM_SMUNT_CUS on OA_SERVICE_REQUESTS.DIVCOD = ELVM_SMUNT_CUS.DIVCOD and OA_SERVICE_REQUESTS.UNTNUM = ELVM_SMUNT_CUS.UNTNUM WHERE OA_SERVICE_REQUESTS.CUSREG_ID=4
方案2:若需两次连接,先确保关联维度是唯一匹配
如果你的业务逻辑真的需要从ELVM_SMUNT_CUS的两个独立维度(比如DIVCOD对应的部门信息和UNTNUM对应的单元信息)取数,那得先保证每个关联字段在子查询中是唯一的,避免交叉匹配产生冗余数据:
select * from OA_SERVICE_REQUESTS -- 先过滤出每个DIVCOD对应的唯一记录 inner join ( select DISTINCT DIVCOD, DIV_NAME -- 替换成你实际需要的字段 from ELVM_SMUNT_CUS ) T1 on OA_SERVICE_REQUESTS.DIVCOD = T1.DIVCOD -- 同理过滤出每个UNTNUM对应的唯一记录 inner join ( select DISTINCT UNTNUM, UNT_NAME -- 替换成你实际需要的字段 from ELVM_SMUNT_CUS ) T2 on OA_SERVICE_REQUESTS.UNTNUM = T2.UNTNUM WHERE OA_SERVICE_REQUESTS.CUSREG_ID=4
验证小技巧
你可以随便挑一条OA_SERVICE_REQUESTS的记录,分别执行这两个查询:
-- 统计该DIVCOD的匹配数 select count(*) from ELVM_SMUNT_CUS where DIVCOD = '目标DIVCOD值'; -- 统计该UNTNUM的匹配数 select count(*) from ELVM_SMUNT_CUS where UNTNUM = '目标UNTNUM值';
把这两个数相乘,再乘以10,看看是不是等于120——如果是,就实锤了是笛卡尔积的问题!
内容的提问来源于stack exchange,提问作者Md Hasibur Rahaman
相关产品推荐
相关产品推荐

