第一条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';
没有记录返回
我想问下,我本想获取第二条和第三条查询结果的并集,所以写了第一条代替,查询结果告诉我我错了,但我想知道错误的原因,请数据库大神解释下第一条错误原因,谢谢不胜感激!
我想了下,用楼上的left join right join这两个应该不适合,
因为你的需求是合并第二条和第三条查询结果,
然后你需求的列,大多数都是一样的,可以考虑用 union all 来合并上面的第二个和第三个sql
哥们,你一语中的,确实是我想解决的问题,我尝试下用unionall
和别名的方式关联相同字段,万分感谢!
@cyzhr:不客气~
使用left join right join
这样说有点笼统,能否给出代码解释
把你第一条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的 逻辑有问题?
detail 是详情表,里面有企业enterprise详情,有车辆car详情,他们的id与detail表里的实体entityid关联,但你不能说carid=enterpriseid,他们都是detail的entitiyid的部分数据
好吧,那么问题来了,你怎么知道detail 里面entitiyid存的是carid还是enterpriseid,你如何区分
假如detail 表里entitiyid 是 1;
car表里面carid 有一条是1;
enterprise 表enterpriseid 也有一条是1;
那么你怎么知道detail 表中的entitiyid 是 carid为1的 还是enterpriseid 为1 的
@、熙和:
先回答您的问题,id唯一,另外有一个字段是type可以区分。问题是你区分哪些是carid哪些是enterpriseid跟我问的问题有什么关系么?
@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';
@、熙和: 不行的,因为left join造成主题表为enterprise,而car变成了从表
@cyzhr: .....你试过么?
@、熙和: 逻辑上不通顺,enterprise和car是并列关系,不存在主从关系
@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,
这里做为主表的是 a , e 和 c 都是它的从表
@、熙和:
即使这样第一个关联获取到的临时表也是enterprise为主表,再left任何表,后边的都属于从表
@、熙和: 难道是我之前对左关联理解错误了么?第二个leftjoin是在第一个leftjoin上继续左关联的还是,都左关联的a表,前后作为副表没差别呢?我会尝试一下,但是分数没有了,你这种解决方案很可能是对的,我研究下,谢谢您的热心回复!下次给您补回来
@、熙和: 再次道谢!
@cyzhr:
left join只是一个表关联运算,顺序是从第一个表开始往后依次关联
第一次关联获取到的临时表, 结果集只可能 >=enterprise; 第二次关联是用这个结果集去关联car表的
@cyzhr: 客气了. 多表左联还是有些区别的, 如果存在一对多这种情况.就会有问题
你的第一条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';
显然,存在笛卡尔积。
你拆解的是正确的,但我想合并,把第二第三合并到一起,不知道有没高见!
@cyzhr: 认同楼下