最原始的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

解决方案 »

  1.   

    不会犯这么简单的错误的数据结果大致如下:010111111-14980B 经典集中豹纹蝶形一片式挺拔性感文胸 豹纹 80B M010502         0 1
    010111111-14980B 经典集中豹纹蝶形一片式挺拔性感文胸 豹纹 80B C430103         0 2
    010111111-14980B 经典集中豹纹蝶形一片式挺拔性感文胸 豹纹 80B P1-A05-10D04 0 3
      

  2.   

    那真没碰到过了   order by怎么可能对值有影响呢   
      

  3.   

    要不怎么叫诡异呢,order by 和 like好像有冲突,同时重建一个表,同样的数据就没问题了,所以可能跟数据的物理存储有关系,但真没明白到底是什么原因导致的
      

  4.   

    单独查询
    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的,真是怪事
      

  5.   


    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不能同时用?
      

  6.   


     同时用也不报错   但是order by没效果  想获得排序后的前多少  那要以排序后的表作为表来查询rownum
      

  7.   

    其实我觉得是这样的你的表里有一些行 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%‘ 
    有没有结果
      

  8.   


    这个表里确实有StockQty=0的数据,但是只有很少几条,而且都不属于此warecode的,所以用这条语句查询结果为空。
      

  9.   

    order by 不能和 rownum 同时使用
      

  10.   

    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 字段里的值前面有空格或者其它特殊字符造成的