left join问题

a380346189 2016-12-30 11:34:30
有两张表a b,根据我写的sql a中有数据,b中没有数据但是为什么当我把b的查询条件里加上就能查到数据,不加的时候就查不到数据呢?

情况一
select a.V_ZBMCHENG,
a.V_ZBBMING,
a.V_EMGJSGSHI,
Lower(a.V_ZBBHAO) V_ZBBHAO,
a.V_ZBBHAO V_ZBBHAO_NEW,
Lower(a.V_JSGSHI) V_JSGSHI,
a.V_SFZYZB,
a.V_SFHGL,
a.HY_XMGLID,
a.HY_SCZBGL_ID,
a.V_XSDWSHU,
'' L_CSZHI,
'' HY_SCZB_DATA_ID
from hy_sczbgl a
left join (select *
from HY_SCZB_DATA
where hy_xmgliid = '4ecd77b7-9cfc-48d9-949d-9691d58962eb'
AND v_operator = 'jxstar'
AND v_lrsj = ''
AND v_time = ''
AND v_bcbh = '') b
on a.HY_SCZBGL_ID = b.HY_SCZBGLI_ID
where a.HY_XMGLID = '4ecd77b7-9cfc-48d9-949d-9691d58962eb'


这样 查询没有数据

情况二:我仅仅是把b的查询里的v_lrsj v_time v_bcbh 三个字段给了值然后就有数据了

select a.V_ZBMCHENG,
a.V_ZBBMING,
a.V_EMGJSGSHI,
Lower(a.V_ZBBHAO) V_ZBBHAO,
a.V_ZBBHAO V_ZBBHAO_NEW,
Lower(a.V_JSGSHI) V_JSGSHI,
a.V_SFZYZB,
a.V_SFHGL,
a.HY_XMGLID,
a.HY_SCZBGL_ID,
a.V_XSDWSHU,
b.N_VALUE L_CSZHI,
'' HY_SCZB_DATA_ID
from hy_sczbgl a
left join (select *
from HY_SCZB_DATA b
where b.hy_xmgliid = '4ecd77b7-9cfc-48d9-949d-9691d58962eb'
AND b.v_operator = 'jxstar'
AND b.v_lrsj = '2016-12-30'
AND b.v_time = '11:30'
AND b.v_bcbh = '早') b
on a.HY_SCZBGL_ID = b.HY_SCZBGLI_ID
where a.HY_XMGLID = '4ecd77b7-9cfc-48d9-949d-9691d58962eb'


但是我单独查询b表
select *
from HY_SCZB_DATA
where hy_xmgliid = '4ecd77b7-9cfc-48d9-949d-9691d58962eb'
AND v_operator = 'jxstar'
AND v_lrsj = ''
AND v_time = ''
AND v_bcbh = ''

不给值查询,或者给值查询
select *
from HY_SCZB_DATA b
where b.hy_xmgliid = '4ecd77b7-9cfc-48d9-949d-9691d58962eb'
AND b.v_operator = 'jxstar'
AND b.v_lrsj = '2016-12-30'
AND b.v_time = '11:30'
AND b.v_bcbh = '早'

都是没有数据的。

按照我的理解 left join 等于a 表 加上 a 和 b 的关联, 那么无论b表 有没有数据, 都应该有a表的数据存在啊

为什么会出现这样的情况,是因为表结构设计的原因吗?
...全文
144 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
a380346189 2016-12-30
  • 打赏
  • 举报
回复
引用 5 楼 Tiger_Zhao 的回复:
Oracle 中最蛋疼的就是 '' 等同于 NULL。 所以条件中 v_lrsj = '' 就是拿字段和 NULL 进行比较,属于结果不可预期的情况。 你在拼写 SQL 时发现空字符串条件要么不拼这个条件,要么用 NVL 把空字符串变成带一个空格的字符串。 有人在论坛中说个 Oracle 有什么选项可以设置,让 '' 不等于 NULL。 不知道是不是真的,找不到帖子了。
感谢各位的回复,只要自己理解的left join并没有错。的确是如果知道条件里的值 不为'' 空串的话,就不会出现上面的问题。 sql.append(" AND b.v_time = nvl('"+ v_time +"', ' ')"); 给每句话加了nvl 可以防止出错~
Tiger_Zhao 2016-12-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 a380346189 的回复:][img=https://img-bbs.csdn.net/upload/201612/30/1483077659_492024.png][/Quote]
改用 b.v_time is null 测一下。
卖水果的net 2016-12-30
  • 打赏
  • 举报
回复
你这个问题,确实怪事儿; 按理说,你在 b 表中,使用 col_name = '' 和 col_name is null ,不会影响你这个查询的;
Tiger_Zhao 2016-12-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 js14982 的回复:]我用自己的数据表测试是有数据的,并没有你说的这种情况出现啊? [/Quote]
在你的数据库中,建个单列的表 t(id),插入 'a','',NULL 三行数据;
然后试试 id 等于/不等于 ''/NULL 四种组合各返回几条记录。
js14982 2016-12-30
  • 打赏
  • 举报
回复
我用自己的数据表测试是有数据的,并没有你说的这种情况出现啊?
js14982 2016-12-30
  • 打赏
  • 举报
回复
不会的啊? 即使有v_lrsj = ''的情况,左匹配也会有数据的啊?
Tiger_Zhao 2016-12-30
  • 打赏
  • 举报
回复
Oracle 中最蛋疼的就是 '' 等同于 NULL。
所以条件中 v_lrsj = '' 就是拿字段和 NULL 进行比较,属于结果不可预期的情况。
你在拼写 SQL 时发现空字符串条件要么不拼这个条件,要么用 NVL 把空字符串变成带一个空格的字符串。

有人在论坛中说个 Oracle 有什么选项可以设置,让 '' 不等于 NULL。
不知道是不是真的,找不到帖子了。
H_Gragon 2016-12-30
  • 打赏
  • 举报
回复
无论B表有没有数据,A表都会有


H_Gragon 2016-12-30
  • 打赏
  • 举报
回复
按说都会有数据啊,你说的居然神了
a380346189 2016-12-30
  • 打赏
  • 举报
回复


查询是这个结果。
我的业务需求是, a 表连接b 表,b表通过where里的条件筛选数据。
在查询时a表是保证一定有数据, b表根据条件可能会没有数据。
为什么会出现这种情况, 我理解的left join查询 应该是如果a表有数据,不可能出现总体查询没有数据的情况啊,请指点
卖水果的net 2016-12-30
  • 打赏
  • 举报
回复
楼主方便给一些测试数据吗?

17,086

社区成员

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

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