最原始的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
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
010111111-14980B 经典集中豹纹蝶形一片式挺拔性感文胸 豹纹 80B C430103 0 2
010111111-14980B 经典集中豹纹蝶形一片式挺拔性感文胸 豹纹 80B P1-A05-10D04 0 3
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的,真是怪事
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不能同时用?
同时用也不报错 但是order by没效果 想获得排序后的前多少 那要以排序后的表作为表来查询rownum
select *
from ac_placestock b
where
b.STOCKQTY=0 and b.WARECODE Like '%010110404%‘,and not like '%010110404%‘
有没有结果
这个表里确实有StockQty=0的数据,但是只有很少几条,而且都不属于此warecode的,所以用这条语句查询结果为空。
FROM bd_ware a, ac_placestock b
where a.warecode = b.warecode(+)
and a.WARECODE Like '%010110404%'
order by warecode
warecode 字段里的值前面有空格或者其它特殊字符造成的