SELECT DISTINCT a.*
FROM AuctionSell a where  a.asid IN
          (SELECT TOP 1 AuctionSell.asid
         FROM AuctionSell
         WHERE AuctionSell.CreateUID = a.CreateUID
         ORDER BY asid desc)-----------------------------------------select  * from AuctionSell a  where 
(select count(1) from AuctionSell b 
where b.asid<=a.asid   and a.CreateUID=b.CreateUID ) <=1   查询出来的数据分别是
ASID   AID      A       B       Price    State        CreateUID
735 206 NULL NULL 17.40 分配完成 66667777
739 206 NULL NULL 17.10 分配完成 666666
750 207 NULL NULL 16.40 未得标 660025
905 227 NULL NULL 14.40 分配完成 660120
933 230 NULL NULL 15.80 分配完成 66000159
998 237 NULL NULL 16.00 分配完成 660143
1069 248 NULL NULL 15.60 分配完成 660019
1122 255 NULL NULL 15.40 未得标 660068
1130 256 NULL NULL 17.60 分配完成 660010
1382 286 NULL NULL 16.00 分配完成 660096 
------------------------------------------------------
714 205 NULL NULL 14.60 未得标 660007
716 205 NULL NULL 14.60 未得标 660008
718 205 NULL NULL 16.00 未得标 660084
719 205 NULL NULL 15.40 未得标 660129
721 205 NULL NULL 14.60 未得标 660009
722 205 NULL NULL 15.20 未得标 660117
723 205 NULL NULL 16.20 分配完成 660125
724 205 NULL NULL 16.30 分配完成 660037
725 205 NULL NULL 15.60 未得标 660010
726 205 NULL NULL 15.40 未得标 666888
两段语句查询出来的数据是一样多,我只取了前10条数据。有点转不过来,我在第二段查询语句后面加上ORDER BY asid desc 数据还是没变,只是顺序变,按第二段这种写法,有没有办法查询出第一段的结果?麻烦大牛解释详细点。 SQL复杂自连接

解决方案 »

  1.   

    你的数据有重复,还要distinct吗
      

  2.   

    两段语句的条件是反的吧,第一个取最大的 asid ,第二个取最小的 asid,
    应该把 b.asid<=a.asid 改成 b.asid>=a.asid, 或者:
    where a.asid in
    (select max(asid) from AuctionShell group by CreateUID )
      

  3.   

    第一段是通过CreateUID进行子查询,找到CreateUID相同的情况下,倒排序top1,也就是asid最大的值,然后通过in来过滤,这样的记录。第二段通过CreateUID相等,到内层去找,比外层的asid要小的asid的个数,如果这个个数小于1,那么就返回这条记录。注意,比外层的asid要小的asid的个数,这个个数小于1,如果这个值是1,说白了就是比自己小的只有一个值,那就是自己,所以这个值不是最大值,而是最小值。如果比自己小的值有5个,那么说明这个值,至少不是最小的,但也不一定是最大。所以,像上面说的,把:where b.asid<=a.asid   and a.CreateUID=b.CreateUID改为
    where b.asid>=a.asid   and a.CreateUID=b.CreateUID这样改了后,就是比a.asid的值大的值,只有1个,那么也就是其他值都比这个值要小,那么这个值就是最大值。