首页新闻找找看学习计划

oracle where 关联的结果集与预想不同,求大神释疑

0
悬赏园豆:50 [已解决问题] 解决于 2016-12-14 16:55

第一条sql
select distinct a.entityid,
       a.filename,
       a.fileurl,
       a.uploadtime,
       e.epname eepname,
       e.id eid,
       c.epname cepname,
       c.id cid,
       c.epname cepname,
       c.carno
  from ANNEXDETAIL a, enterprise e, car c
 where  (a.entityid = e.id or a.entityid = c.id)
and a.fileurl = '/upload/anquanyingji/2088/2016-11-09/anquanyingji.pdf';
可以获取6000条记录

第二条sql
select a.entityid,
       a.filename,
       a.fileurl,
       a.uploadtime,
       e.epname,
       e.id     
  from ANNEXDETAIL a, enterprise e
 where (a.entityid = e.id )
   and a.fileurl = '/upload/anquanyingji/2088/2016-11-09/anquanyingji.pdf';
可以获取3条记录

第三条sql
select a.entityid,
       a.filename,
       a.fileurl,
       a.uploadtime,
       c.epname,
       c.id,
       c.carno
  from ANNEXDETAIL a,  car c
 where (a.entityid = c.id)
   and a.fileurl = '/upload/anquanyingji/2088/2016-11-09/anquanyingji.pdf';
没有记录返回

我想问下,我本想获取第二条和第三条查询结果的并集,所以写了第一条代替,查询结果告诉我我错了,但我想知道错误的原因,请数据库大神解释下第一条错误原因,谢谢不胜感激!

cyzhr的主页 cyzhr | 初学一级 | 园豆:157
提问于:2016-12-14 11:14
< >
分享
最佳答案
0

我想了下,用楼上的left join    right join这两个应该不适合,

因为你的需求是合并第二条和第三条查询结果,

然后你需求的列,大多数都是一样的,可以考虑用 union all 来合并上面的第二个和第三个sql

收获园豆:40
代码飞了 | 菜鸟二级 |园豆:470 | 2016-12-14 13:58

哥们,你一语中的,确实是我想解决的问题,我尝试下用unionall
和别名的方式关联相同字段,万分感谢!

cyzhr | 园豆:157 (初学一级) | 2016-12-14 16:47

@cyzhr:不客气~

代码飞了 | 园豆:470 (菜鸟二级) | 2016-12-14 17:29
其他回答(3)
0

使用left join    right join

疯五五爱喝咖啡 | 园豆:247 (菜鸟二级) | 2016-12-14 11:32


这样说有点笼统,能否给出代码解释

支持(0) 反对(0) cyzhr | 园豆:157 (初学一级) | 2016-12-14 11:38
0

把你第一条sql的条件 or  换成  and

你自己观察一下

第一条sql :

where  (a.entityid = e.id or a.entityid = c.id) 

第二条sql:

 where (a.entityid = e.id )

第三条sql:
 where (a.entityid = c.id)

 

第二条\第三条sql都是用a.entityid 和 e表  c表关联的 ,说明a.entityid   = e.id  =  c.id

 

这样看 , 你是不是发现了 ,第一条sql的 逻辑有问题?

收获园豆:5
、熙和 | 园豆:1486 (小虾三级) | 2016-12-14 11:43

detail 是详情表,里面有企业enterprise详情,有车辆car详情,他们的id与detail表里的实体entityid关联,但你不能说carid=enterpriseid,他们都是detail的entitiyid的部分数据

支持(0) 反对(0) cyzhr | 园豆:157 (初学一级) | 2016-12-14 11:49

好吧,那么问题来了,你怎么知道detail 里面entitiyid存的是carid还是enterpriseid,你如何区分

支持(0) 反对(0) 、熙和 | 园豆:1486 (小虾三级) | 2016-12-14 11:57

假如detail 表里entitiyid 是 1;

car表里面carid 有一条是1;

enterprise 表enterpriseid 也有一条是1;

 

那么你怎么知道detail 表中的entitiyid  是  carid为1的 还是enterpriseid 为1 的

支持(0) 反对(0) 、熙和 | 园豆:1486 (小虾三级) | 2016-12-14 11:59

@、熙和:
先回答您的问题,id唯一,另外有一个字段是type可以区分。问题是你区分哪些是carid哪些是enterpriseid跟我问的问题有什么关系么?

支持(0) 反对(0) cyzhr | 园豆:157 (初学一级) | 2016-12-14 14:48

@cyzhr:  那就好办了, 使用left join , 你可以试一下 , 我测试最后结果查询数据没问题, 如果a.entityid = e.id, 那么car 表c.id!=a.entityid,相关字段为null值

select * from ANNEXDETAIL a
 left join enterprise e on a.entityid = e.id 
 left join car c on a.entityid = c.id
 where  a.fileurl = '/upload/anquanyingji/2088/2016-11-09/anquanyingji.pdf';
支持(0) 反对(0) 、熙和 | 园豆:1486 (小虾三级) | 2016-12-14 16:22

@、熙和: 不行的,因为left join造成主题表为enterprise,而car变成了从表

支持(0) 反对(0) cyzhr | 园豆:157 (初学一级) | 2016-12-14 16:44

@cyzhr: .....你试过么?

支持(0) 反对(0) 、熙和 | 园豆:1486 (小虾三级) | 2016-12-14 17:04

@、熙和: 逻辑上不通顺,enterprise和car是并列关系,不存在主从关系

支持(0) 反对(0) cyzhr | 园豆:157 (初学一级) | 2016-12-14 17:07

@cyzhr: 这里enterprise和car是主从关系吗?.........我不理解了

select * 
from ANNEXDETAIL a
 left join enterprise e on a.entityid = e.id 
 left join car c on a.entityid = c.id
 where  a.fileurl = '/upload/anquanyingji/2088/2016-11-09/anquanyingji.pdf';

是用  a 去 左联 e,  然后才去左联的 c,

支持(0) 反对(0) 、熙和 | 园豆:1486 (小虾三级) | 2016-12-14 17:09

这里做为主表的是 a , e 和 c  都是它的从表

支持(0) 反对(0) 、熙和 | 园豆:1486 (小虾三级) | 2016-12-14 17:10

@、熙和:

即使这样第一个关联获取到的临时表也是enterprise为主表,再left任何表,后边的都属于从表

支持(0) 反对(0) cyzhr | 园豆:157 (初学一级) | 2016-12-14 17:12

@、熙和: 难道是我之前对左关联理解错误了么?第二个leftjoin是在第一个leftjoin上继续左关联的还是,都左关联的a表,前后作为副表没差别呢?我会尝试一下,但是分数没有了,你这种解决方案很可能是对的,我研究下,谢谢您的热心回复!下次给您补回来

支持(0) 反对(0) cyzhr | 园豆:157 (初学一级) | 2016-12-14 17:18

@、熙和: 再次道谢!

支持(0) 反对(0) cyzhr | 园豆:157 (初学一级) | 2016-12-14 17:19

@cyzhr: 

left join只是一个表关联运算,顺序是从第一个表开始往后依次关联

第一次关联获取到的临时表, 结果集只可能 >=enterprise;   第二次关联是用这个结果集去关联car表的

支持(0) 反对(0) 、熙和 | 园豆:1486 (小虾三级) | 2016-12-14 17:34

@cyzhr: 客气了.  多表左联还是有些区别的, 如果存在一对多这种情况.就会有问题

支持(0) 反对(0) 、熙和 | 园豆:1486 (小虾三级) | 2016-12-14 17:41
0

你的第一条sql可以发现关联的是三张表的数据,对吧。然后你固定的表的只有两个。

(a.entityid = e.id or a.entityid = c.id) 所以要不固定a和e,要不固定a和c

换个语句模拟就是

select * from a,e,c where a.a.entityid = e.id  and a.fileurl = '/upload/anquanyingji/2088/2016-11-09/anquanyingji.pdf';

和select * from a,e,c where a.entityid = c.id  and a.fileurl = '/upload/anquanyingji/2088/2016-11-09/anquanyingji.pdf';

 

显然,存在笛卡尔积。

收获园豆:5
guodaxia | 园豆:87 (初学一级) | 2016-12-14 12:07

你拆解的是正确的,但我想合并,把第二第三合并到一起,不知道有没高见!

支持(0) 反对(0) cyzhr | 园豆:157 (初学一级) | 2016-12-14 16:46

@cyzhr: 认同楼下

支持(0) 反对(0) guodaxia | 园豆:87 (初学一级) | 2016-12-14 16:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册