有商品表 T1MM11_GOODS_CODE 
主key是商品code(GOODS_CODE),有效日(ORDER_EFFECT_DATE)
要抽出这个表基于某个日期(下面的例子用2008/12/19)的所有有效商品code
我这里有2中做法
A方法
select T1.GOODS_CODE
from T1MM11_GOODS_CODE T1
inner join
(select GOODS_CODE,Max(ORDER_EFFECT_DATE) as ORDER_EFFECT_DATE
from T1MM11_GOODS_CODE T2
Where ORDER_EFFECT_DATE<'2008/12/19'
group by GOODS_CODE) T3
On T1.GOODS_CODE=T3.GOODS_CODE
And T1.ORDER_EFFECT_DATE=T3.ORDER_EFFECT_DATE
Where T1.DEL_FLG='0'B方法
select T1.GOODS_CODE
from T1MM11_GOODS_CODE T1
where ORDER_EFFECT_DATE=
(select Max(ORDER_EFFECT_DATE) as ORDER_EFFECT_DATE
from T1MM11_GOODS_CODE T2
Where ORDER_EFFECT_DATE<'2008/12/19'
AND T1.GOODS_CODE=T2.GOODS_CODE
group by GOODS_CODE) 
and T1.DEL_FLG='0'现在表的数据是14万
执行的结果是B方法明显比A方法快
但是换其他的表后,有A方法比B方法快的情况
请高人指点,是不是在某些特定情况下,A,B方法各有快慢?
或者那位有更好的做法?
谢谢指点

解决方案 »

  1.   

    select *
    from 
    (select *
    from T1MM11_GOODS_CODE 
    where ORDER_EFFECT_DATE <'2008/12/19'
    order by ORDER_EFFECT_DATE desc)
    where rownum=1
      

  2.   

    select GOODS_CODE
      from (select GOODS_CODE,
                   row_number() over(partition by GOODS_CODE order by ORDER_EFFECT_DATE desc from T1MM11_GOODS_CODE) rn
             Where ORDER_EFFECT_DATE < '2008/12/19'
               and T1.DEL_FLG = '0')
     where rn = 1
      

  3.   

    select GOODS_CODE
      from (select GOODS_CODE,
                   row_number() over(partition by GOODS_CODE order by ORDER_EFFECT_DATE desc) rn
              from T1MM11_GOODS_CODE
             Where ORDER_EFFECT_DATE < '2008/12/19'
               and T1.DEL_FLG = '0')
     where rn = 1
      

  4.   

    奶奶的还错了一点。
    select GOODS_CODE
      from (select GOODS_CODE,
                   row_number() over(partition by GOODS_CODE order by ORDER_EFFECT_DATE desc) rn
              from T1MM11_GOODS_CODE
             Where ORDER_EFFECT_DATE < '2008/12/19'
               and DEL_FLG = '0')
     where rn = 1
      

  5.   


    select * 
    from T1MM11_GOODS_CODE a
    where  not exists(select 1 from T1MM11_GOODS_CODE where ORDER_EFFECT_DATE=a.ORDER_EFFECT_DATE and ORDER_EFFECT_DATE>a.ORDER_EFFECT_DATE)參照寫法;有幾种方法都是通用的
    http://topic.csdn.net/u/20081106/11/b2f6633d-f96e-444f-9264-8d8528d308fa.html
      

  6.   

    貼錯地址
    這個
    http://topic.csdn.net/u/20080626/00/43d0d10c-28f1-418d-a05b-663880da278a.html
      

  7.   

    row_number() 的方法也是可以的
    我之前也是试过,速度是介于A,B之间
    我想了解的是,什么是可能影响A,B执行难效率的因素
      

  8.   

    ORDER_EFFECT_DATE、DEL_FLG 建索引。再把sort_area_size hash_area_size调大些
      

  9.   

    可能是我没看明白楼主的需求,但就我目前的理解来看,不是要取出所有在有效期之前的商品code吗?
    那为什么要这么麻烦呢
    select distinct GOODS_CODE
    from T1MM11_GOODS_CODE 
    where ORDER_EFFECT_DATE <'2008/12/19'
    and  DEL_FLG = '0'
    这样不就好了吗?
      

  10.   

    select T1.GOODS_CODE 
    from T1MM11_GOODS_CODE T1 
    where ORDER_EFFECT_DATE= 
    (select Max(ORDER_EFFECT_DATE) as ORDER_EFFECT_DATE 
    from T1MM11_GOODS_CODE T2 
    Where ORDER_EFFECT_DATE <'2008/12/19' 
    AND T1.GOODS_CODE=T2.GOODS_CODE 
    --group by GOODS_CODE   这个group by 加在这干嘛呢,多余

    and T1.DEL_FLG='0' 
      

  11.   

    怎么,难道sql语句有什么问题吗?
      

  12.   

    试一试这种写法:
    SELECT T1.GOODS_CODE
      FROM T1MM11_GOODS_CODE T1,
           (SELECT GOODS_CODE, MAX(ORDER_EFFECT_DATE) AS ORDER_EFFECT_DATE
              FROM T1MM11_GOODS_CODE
             WHERE ORDER_EFFECT_DATE < '2008/12/19'
               AND DEL_FLG = '0'
             GROUP BY GOODS_CODE) T2
     WHERE T1.GOODS_CODE = T2.GOODS_CODE
       AND T1.ORDER_EFFECT_DATE < '2008/12/19'
       AND T1.DEL_FLG = '0'
      

  13.   

    -- 这问题真有趣..
    SELECT DISTINCT GOODS_CODE
      FROM T1MM11_GOODS_CODE
     WHERE ORDER_EFFECT_DATE < '2008/12/19'
       AND DEL_FLG = '0';