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

cyzhr 2016-12-14 11:08:20
第一条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';
没有记录返回

我想问下,我本想获取第二条和第三条查询结果的并集,所以写了第一条代替,查询结果告诉我我错了,但我想知道错误的原因,请数据库大神解释下第一条错误原因,谢谢不胜感激!
...全文
111 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sych888 2016-12-14
  • 打赏
  • 举报
回复
表关联时,不要这样用 (a.entityid = e.id or a.entityid = c.id) 很容易出问题,造成笛卡乘积什么的 你要先把业务滤清楚
js14982 2016-12-14
  • 打赏
  • 举报
回复
没有可比性,你的第一条语句,你用的or,当你a和e表匹配,没有匹配c表,所以会出现大量重复数据。同理a和c匹配一样
H_Gragon 2016-12-14
  • 打赏
  • 举报
回复
关联条件改成and 并加左关联(a.entityid = e.id and a.entityid = c.id(+)
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 and a.entityid = c.id(+))
and a.fileurl = '/upload/anquanyingji/2088/2016-11-09/anquanyingji.pdf';
H_Gragon 2016-12-14
  • 打赏
  • 举报
回复
关联条件改成and (a.entityid = e.id and a.entityid = c.id)
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 and a.entityid = c.id)
and a.fileurl = '/upload/anquanyingji/2088/2016-11-09/anquanyingji.pdf';
卖水果的net 2016-12-14
  • 打赏
  • 举报
回复
三条语句都不等价,查出来的结果自然是不一样的; 楼主在纠结什么呢?
cyzhr 2016-12-14
  • 打赏
  • 举报
回复
引用 5 楼 sych888 的回复:
表关联时,不要这样用 (a.entityid = e.id or a.entityid = c.id) 很容易出问题,造成笛卡乘积什么的 你要先把业务滤清楚
你说的是对的,我如果想把第二句第三句合并到一句里,我第一句是错误的,怎样实现一句查询结果等于后两句呢?我没有用leftjonin 和innerjoin,那where关联时执行的其实是where a.entityid = e.id and and a.fileurl = '/upload/anquanyingji/2088/2016-11-09/anquanyingji.pdf' 和where a.entityid = c.id and a.fileurl = '/upload/anquanyingji/2088/2016-11-09/anquanyingji.pdf'两个查询的union all 结果集,可是查询结果明显不是预期的那样,请问我的思路哪里是错误的?
引用 9 楼 sych888 的回复:
[quote=引用 6 楼 sinat_26467463 的回复:] [quote=引用 1 楼 wmxcn2000 的回复:] 三条语句都不等价,查出来的结果自然是不一样的; 楼主在纠结什么呢?
这样说吧,我想让第二句加第三句合并成一句,求怎么写?[/quote] 直接用UNION ALL 就行了 没有的字段,用 NULL填充[/quote] 正解!
sych888 2016-12-14
  • 打赏
  • 举报
回复
引用 6 楼 sinat_26467463 的回复:
[quote=引用 1 楼 wmxcn2000 的回复:] 三条语句都不等价,查出来的结果自然是不一样的; 楼主在纠结什么呢?
这样说吧,我想让第二句加第三句合并成一句,求怎么写?[/quote] 直接用UNION ALL 就行了 没有的字段,用 NULL填充
cyzhr 2016-12-14
  • 打赏
  • 举报
回复
引用 4 楼 js14982 的回复:
没有可比性,你的第一条语句,你用的or,当你a和e表匹配,没有匹配c表,所以会出现大量重复数据。同理a和c匹配一样
对的,我隐约感觉是三表关联,临时表多了数据但是,我想让第二句和第三句合并到一句里,写了像第一句来解决,该怎样写才是正确的呢?
cyzhr 2016-12-14
  • 打赏
  • 举报
回复
引用 2 楼 cnceohjm 的回复:
关联条件改成and (a.entityid = e.id and a.entityid = c.id)
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 and a.entityid = c.id)
and a.fileurl = '/upload/anquanyingji/2088/2016-11-09/anquanyingji.pdf';
为什么要改成and呢?我是满足任何一个的与关系的并集 不是交集
cyzhr 2016-12-14
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
三条语句都不等价,查出来的结果自然是不一样的; 楼主在纠结什么呢?
这样说吧,我想让第二句加第三句合并成一句,求怎么写?

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧