右链了2个表后,请问要如何去写去除重复数据的sql呢?
DISTINCT 和hvaing count都用过了,但是依然有重复数据
SELECT  s.prodid,p.prodname,prodprice,
(select top 1 filename from product_photos where prodid=s.prodid order by adddate) as [filename],DTime,[site],0 from orderform o(nolock) 
right join
order_sub s(nolock) on o.orderformid=s.orderfromid 
right join 
product p(nolock) on p.prodid=s.prodid 
and 
datediff(Day,DTime,getdate())<180 
where 
o.dhrnickname='aa' 
order by o.dayTime DESC 

解决方案 »

  1.   

    顶 补充下
     是根据 s.proid 来判断是否为重复数据
      

  2.   

    删除重复数据方法一: select * from A b where not exists(select 1 from A where id<b.ID)
      

  3.   

    --猜测
    SELECT
     s.prodid,p.prodname,prodprice,
     (select top 1 filename from product_photos where prodid=s.prodid order by adddate)  as [filename],DTime,[site],0 from orderform o(nolock)  
    right join
    order_sub s(nolock) on o.orderformid=s.orderfromid  
    right join  
    product p(nolock) on p.prodid=s.prodid  
    and  
    datediff(Day,DTime,getdate())<180  
    where  
    o.dhrnickname='aa' 
    and
    s.proid=(select max(s.proid) from order_sub where  orderformid=s.orderformid)
    order by o.dayTime DESC 
      

  4.   


    图。就是prodid  不能有重复的。
      

  5.   

    你一样的数据里面,DTime都是不一样的,所以导致了重复
      

  6.   

    如果proid只有一条,你要哪个DTime?
      

  7.   

    回楼上
    这个DTime 要最新的。
      

  8.   

    SELECT s.prodid,p.prodname,prodprice,
    (select top 1 filename from product_photos where prodid=s.prodid order by adddate) as [filename],
    max(DTime) as DTime,[site],0 from orderform o(nolock)  
    right join order_sub s(nolock) on o.orderformid=s.orderfromid  
    right join  product p(nolock) on p.prodid=s.prodid  
    and  datediff(Day,DTime,getdate())<180  
    where  o.dhrnickname='aa'  
    group by s.prodid,p.prodname,prodprice,[filename],[site]
    order by o.dayTime DESC 取最大的DTime用:max(DTime) as DTime,
    取最小的DTime用:min(DTime) as DTime,
      

  9.   


    Dtime在哪个表?你只要显示每组数据中Dtime最大的记录是吗?
      

  10.   

    回楼上
    DTime在 order_sub
    没错 就是按你说的那样显示。。
    谢谢大大费心
      

  11.   

    确切来说
     应该是
     同proid 的数据 只保留一条 Dtime 最大的
     其他的重复proid 的数据去除掉
      

  12.   

    ;WITH t AS 
    (
    SELECT s.prodid, p.prodname, prodprice, (
       SELECT TOP 1 FILENAME 
       FROM product_photos
       WHERE prodid = s.prodid
       ORDER BY adddate
       ) AS [filename], DTime, [site], 0 num,dayTime,
       rn=ROW_NUMBER()OVER(PARTITION BY s.prodid ORDER BY DTime DESC)
    FROM orderform o(NOLOCK)
    RIGHT JOIN order_sub s(NOLOCK)
    ON  o.orderformid = s.orderfromid
    RIGHT JOIN product p(NOLOCK)
    ON  p.prodid = s.prodid
    AND DATEDIFF(DAY, DTime, GETDATE())<180
    WHERE o.dhrnickname = 'aa'
    )
    SELECT prodid, prodname,prodprice,[filename],DTime,[site],num
    FROM t 
    WHERE rn=1
    ORDER BY dayTime DESC 先试下这个,看出来的结果是不是你要的
      

  13.   

    感谢楼上。。
    确实就是这个结果。。
    但是用到while的话。
    敢问一句。。性能会不会很差。
    因为本身的数据量就灰常灰常的大。。