非常诡异的数据查询现象

mg_chen 2012-05-24 11:47:39
最原始的SQL语句如下:

select AA.*, ROWNUM AS RowNo
from (SELECT a.WARECODE, a.WARENAME, b.PLACECODE, b.STOCKQTY
FROM bd_ware a, ac_placestock b
where a.warecode = b.warecode(+)
and a.WARECODE Like '%010110404%'
order by warecode) AA


怪异现象如下:
1、原始SQL执行结果的StockQty列全部为0,但是其他列结果都正常。
2、将原始SQL里的Order by 子句去掉,结果正常,StockQty有值。
3、将原始SQL里的 like '%010110404%'改成 like '010110404%',结果正常。
4、按照ac_placestock表的结构重建一个新表ac_placestock2,并将ac_placestock表的数据用insert方式插入ac_placestock2表中,提交事务后将原始SQL里的ac_placestock替换成ac_placestock2,结果正常。
5、基本上可以判断是ac_placestock表出现了问题,故对此表的主键、索引全部删除,重建,仍用原始SQL查询,结果错误。
6、统计ac_placestock表,仍用原始SQL查询,结果仍错误。
7、将ac_placestock表的数据用delete方法删除,并从ac_placestock2表中将数据插回ac_placestock,用原始SQL查询,结果仍错误。
8、使用 alter table ac_placestock move tablespace XXX将表的数据空间移动,再用原始SQL查询,结果还是错误。

至此,我要崩溃了,实在没明白怎么回事,求高人指点迷津,不甚感激。

有几个异常现象供参考:
1、该表曾经用过SQLLDR进行直接路径导入过。
2、数据库上有GoldGuate的测试环境。
3、关联的两个表都是具有大数据量的表,查询计划看起来都是使用的hash join
...全文
197 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mg_chen 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

SELECT a.WARECODE, a.WARENAME, b.PLACECODE, b.STOCKQTY
FROM bd_ware a, ac_placestock b
where a.warecode = b.warecode(+)
and a.WARECODE L……
[/Quote]

那为何同样的数据插入到另外一个表就OK了呢?好像解释不通
mg_chen 2012-05-25
  • 打赏
  • 举报
回复
诡异,自己顶,只求一个真相
iqlife 2012-05-25
  • 打赏
  • 举报
回复
SELECT a.WARECODE, a.WARENAME, b.PLACECODE, b.STOCKQTY
FROM bd_ware a, ac_placestock b
where a.warecode = b.warecode(+)
and a.WARECODE Like '%010110404%'
order by warecode


warecode 字段里的值前面有空格或者其它特殊字符造成的
wangYikun 2012-05-25
  • 打赏
  • 举报
回复
order by 不能和 rownum 同时使用
mg_chen 2012-05-24
  • 打赏
  • 举报
回复
不会犯这么简单的错误的

数据结果大致如下:

010111111-14980B 经典集中豹纹蝶形一片式挺拔性感文胸 豹纹 80B M010502 0 1
010111111-14980B 经典集中豹纹蝶形一片式挺拔性感文胸 豹纹 80B C430103 0 2
010111111-14980B 经典集中豹纹蝶形一片式挺拔性感文胸 豹纹 80B P1-A05-10D04 0 3
  • 打赏
  • 举报
回复
里面大概有什么数据呢 列举一点看看

是不是有窗口数据没提交?
mg_chen 2012-05-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

其实我觉得是这样的你的表里有一些行 b.STOCKQTY=0 and b.WARECODE Like '%010110404%‘,and not like '%010110404%‘。 所以其实你两条语句返回的结果是不同的。

insert入新表后顺序变了。两条语句返回的前几行是一样的,你直接看到的只是前几行。

你试试
select *
from ac_placestock b
……
[/Quote]

这个表里确实有StockQty=0的数据,但是只有很少几条,而且都不属于此warecode的,所以用这条语句查询结果为空。
简即美 2012-05-24
  • 打赏
  • 举报
回复
其实我觉得是这样的你的表里有一些行 b.STOCKQTY=0 and b.WARECODE Like '%010110404%‘,and not like '%010110404%‘。 所以其实你两条语句返回的结果是不同的。

insert入新表后顺序变了。两条语句返回的前几行是一样的,你直接看到的只是前几行。

你试试
select *
from ac_placestock b
where
b.STOCKQTY=0 and b.WARECODE Like '%010110404%‘,and not like '%010110404%‘
有没有结果
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
看来orderby和rownum不能同时用?
[/Quote]

同时用也不报错 但是order by没效果 想获得排序后的前多少 那要以排序后的表作为表来查询rownum
mg_chen 2012-05-24
  • 打赏
  • 举报
回复

select AA.*
from (SELECT a.WARECODE, a.WARENAME, b.PLACECODE, b.STOCKQTY,row_number() over(order by a.warecode) rid
FROM bd_ware a, ac_placestock b
where a.warecode = b.warecode(+)
and a.WARECODE Like '%010111111-14980B%'
) AA

用这条语句,显示的结果是正确的



select AA.*
from (SELECT a.WARECODE, a.WARENAME, b.PLACECODE, b.STOCKQTY
FROM bd_ware a, ac_placestock b
where a.warecode = b.warecode(+)
and a.WARECODE Like '%010111111-14980B%'
) AA


这条语句,StockQty也是正确的,但是排序和前面一条不一样。


看来orderby和rownum不能同时用?
mg_chen 2012-05-24
  • 打赏
  • 举报
回复
单独查询
SELECT a.WARECODE, a.WARENAME, b.PLACECODE, b.STOCKQTY
FROM bd_ware a, ac_placestock b
where a.warecode = b.warecode(+)
and a.WARECODE Like '%010111111-14980B%'
order by warecode

这条语句,结果也是能显示正常的stockqty的,真是怪事
mg_chen 2012-05-24
  • 打赏
  • 举报
回复
要不怎么叫诡异呢,order by 和 like好像有冲突,同时重建一个表,同样的数据就没问题了,所以可能跟数据的物理存储有关系,但真没明白到底是什么原因导致的
  • 打赏
  • 举报
回复
那真没碰到过了 order by怎么可能对值有影响呢

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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