多个表连接之间用or怎么会查出无限条数据?

woshizn 2009-09-27 11:27:30
ryid 相当于 jbxx.rid 的外键。
语句如下:
select xzjl.rid,xzjl.ryid from yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl,yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = xzjl.ryid or jbxx.rid = jc_zdlg.ryid

结果都到50w条了,而且还没完。

这样不行,应该怎样写了?

望懂的哥们指教下。分奉上。
...全文
188 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangwonderful 2009-09-29
  • 打赏
  • 举报
回复
建议用union all
select xzjl.rid,xzjl.ryid from yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl,yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = xzjl.ryid
union all
select xzjl.rid,xzjl.ryid from yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl,yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = jc_zdlg.ryid
mark620 2009-09-29
  • 打赏
  • 举报
回复
如果是用or的话那肯定会出来N条数据。
jiaruimin11 2009-09-29
  • 打赏
  • 举报
回复
select xzjl.rid, xzjl.ryid
from yzdb.DA_JBXX jbxx, yzdb.JC_XZJL xzjl, yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = xzjl.ryid
union all
select xzjl.rid, xzjl.ryid
from yzdb.DA_JBXX jbxx,
yzdb.JC_XZJL xzjl,
yzdb.JC_ZDLG jc_zdlg jbxx.rid = jc_zdlg.ryid
含重复记录
select xzjl.rid, xzjl.ryid
from yzdb.DA_JBXX jbxx, yzdb.JC_XZJL xzjl, yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = xzjl.ryid
union
select xzjl.rid, xzjl.ryid
from yzdb.DA_JBXX jbxx,
yzdb.JC_XZJL xzjl,
yzdb.JC_ZDLG jc_zdlg jbxx.rid = jc_zdlg.ryid
可以去掉重复记录,这样应该好点

小灰狼W 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 buffon1260 的回复:]
每天回帖即可获得10分可用分!
[/Quote]
汗。。你又好久没来了
结了那个散分帖即可获得50可用分
buffon1260 2009-09-29
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
oraclemch 2009-09-29
  • 打赏
  • 举报
回复
楼主多表连接的时候不能用or来做条件,不然笛卡尔积会量会N多的,建议

select xzjl.rid,xzjl.ryid from yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl,yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = xzjl.ryid or jbxx.rid = jc_zdlg.ryid

改成and


select xzjl.rid, xzjl.ryid
from yzdb.DA_JBXX jbxx, yzdb.JC_XZJL xzjl, yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = xzjl.ryid
and jbxx.rid = jc_zdlg.ryid


或者改成or用union 来连接
select xzjl.rid, xzjl.ryid
from yzdb.DA_JBXX jbxx, yzdb.JC_XZJL xzjl, yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = xzjl.ryid
union all
select xzjl.rid, xzjl.ryid
from yzdb.DA_JBXX jbxx,
yzdb.JC_XZJL xzjl,
yzdb.JC_ZDLG jc_zdlg jbxx.rid = jc_zdlg.ryid
worldhj1 2009-09-29
  • 打赏
  • 举报
回复
怎么能写OR呢~~汗~~!
pobaby 2009-09-28
  • 打赏
  • 举报
回复
改为 and 就ok了,否则笛卡尔了
数据娃掘 2009-09-28
  • 打赏
  • 举报
回复
需要使用and进行关联
小灰狼W 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wildwave 的回复:]
天..
3个大表连接
select xzjl.rid,xzjl.ryid from yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl,yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = xzjl.ryid or jbxx.rid = jc_zdlg.ryid
相当于
SQL codeselect xzjl.rid,xzjl.ryidfrom yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl,yzdb.JC_ZDLG jc_zdlgwhere jbxx.rid= xzjl.ryidunionallselect xzjl.rid,xzjl.ryidfrom yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl,yzdb.JC_ZDLG jc_zdlg
jbxx.rid= jc_zdlg.ryid
union上边的代码等价于jbxx和 xzjl通过条件连接后的结果再跟第三个表无条件连接的笛卡尔积
下边的代码等价于jbxx和 jc_zdlg通过条件连接后的结果再跟第三个表无条件连接的笛卡尔积
两个结果集加起来就更大了
把and 改成or可以避免
楼主看看表连接方面的资料
[/Quote]
......
把or 改成and
写错了
hebo2005 2009-09-28
  • 打赏
  • 举报
回复
楼主逻辑没搞清楚
雪狼__ 2009-09-28
  • 打赏
  • 举报
回复
and 并
or 或
jdsnhan 2009-09-28
  • 打赏
  • 举报
回复
三个表,至少有两个and级的关联条件,而你给出的是or,形成了两次笛卡尔积
小灰狼W 2009-09-28
  • 打赏
  • 举报
回复
天..
3个大表连接
select xzjl.rid,xzjl.ryid from yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl,yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = xzjl.ryid or jbxx.rid = jc_zdlg.ryid
相当于
select xzjl.rid,xzjl.ryid from yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl,yzdb.JC_ZDLG jc_zdlg 
where jbxx.rid = xzjl.ryid
union all
select xzjl.rid,xzjl.ryid from yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl,yzdb.JC_ZDLG jc_zdlg
jbxx.rid = jc_zdlg.ryid

union上边的代码等价于jbxx和 xzjl通过条件连接后的结果再跟第三个表无条件连接的笛卡尔积
下边的代码等价于jbxx和 jc_zdlg通过条件连接后的结果再跟第三个表无条件连接的笛卡尔积
两个结果集加起来就更大了
把and 改成or可以避免
楼主看看表连接方面的资料
liusong_china 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 woshizn 的回复:]
ryid 相当于 jbxx.rid 的外键。
语句如下:
select xzjl.rid,xzjl.ryid from yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl,yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = xzjl.ryid or jbxx.rid = jc_zdlg.ryid

结果都到50w条了,而且还没完。

这样不行,应该怎样写了?

望懂的哥们指教下。分奉上。
[/Quote]
select xzjl.rid,xzjl.ryid from yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl,yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = xzjl.ryid AND jbxx.rid = jc_zdlg.ryid


把or改成AND。。。。。。
yu15tian 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dongbangwu 的回复:]
select xzjl.rid,xzjl.ryid from yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl
where jbxx.rid = xzjl.ryid
union
select yzdb.DA_JBXX jbxx,yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = jc_zdlg.ryid
[/Quote]

用这就能实现了
璇之星 2009-09-28
  • 打赏
  • 举报
回复
这么简单的逻辑没搞清楚!
dongbangwu 2009-09-28
  • 打赏
  • 举报
回复
select xzjl.rid,xzjl.ryid from yzdb.DA_JBXX jbxx,yzdb.JC_XZJL xzjl
where jbxx.rid = xzjl.ryid
union
select yzdb.DA_JBXX jbxx,yzdb.JC_ZDLG jc_zdlg
where jbxx.rid = jc_zdlg.ryid

17,086

社区成员

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

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