诚心诚意地求教
COL1 COL2
A 1
A 2
B 3
B 4
----
结果
A 2
B 4
这样的查询可以用
SELECT COL1,MAX(COL2)
FROM TB
GROUP BY COL1

SELECT COL1,COL2
FROM TB T1
WHERE NOT EXISTS(SELECT 1 FROM TB T2 WHERE T2.COL1=T1.COL1 AND T2.COL2>T1.COL2)这两种方法得到结果。
哪种更快?为什么?或者还有什么更好的办法?

解决方案 »

  1.   

    据说
    SELECT COL1,MAX(COL2) 
    FROM TB 
    GROUP BY COL1 的效率高 具体看执行计划
      

  2.   

    最好能讲讲GROUP和EXISTS之间的比较
      

  3.   


    看到EXISTS,我就毫不犹豫的选择了第1种----------
    在SQL2000以前,一般不要用如下的字句: "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE '%500'",因为他们不走索引全是表扫描。
      

  4.   

    第二条语句是子查询语句,其可转换为 JOIN 操作,两者的执行计划基本相同。
    select t1.col1, t1.col2 
    from tb as t1 join tb as t2 on t1.col1=t2.col1
    where t2.col2 < t1.col2第一条语句使用 group by,其算法有两种:SORT 和 HASH。SORT 算法在处理 GROUP BY 操作时先进行排序,再从已排序的数据中进行分组,此时返回的分组结果将是排序顺序。
    就给出的情景来说,如果 col1 上建有聚集索引则可以避免排序操作,可以大大缩短执行时间。
    第二条语句使用 join,其算法有三种:NESTED LOOP、MERGE 和 HASH。NESTED LOOP 算法在关联操作时,将关联左边的表作为外表,右表作为内表;依次从外表中提取行,每从外表中提取一行便从头开始检索内表,获取符合关联条件的行。
    就给出的情景来说,如果 col1 上建有聚集索引,虽然可以避免扫描 t2 内表,但是却总是要扫描 t1 外表。相对而言,如果 col1 上建立聚集索引,group by 要比 join 更有优势。
      

  5.   

    第1种方法比较快。
    原因:1、使用NOT EXISTS;
          2、使用嵌套函数,能直接执行的,尽量不使用嵌套函数。
      

  6.   

    Exists,not exists 低效的查询
      

  7.   

      如果我没有记错查询原理的话,后者是先查询内嵌套,得到一个结果集,然后再用外查询得到的一个结果集去一个一个的跟前一个结果集比对,相当于两次查询,然后再利用双层循环进行查找。第一种的原理是先利用第一列区分出一个个的集合,再从每个集合中找出第二列最大的记录,是一个单层遍历,执行效率嘛,两者还是有区别的。
      至于效率更高的查询方法,我没想到。至于join查询,我觉得把一张表利用笛卡尔集的方式联合后查询的效率可能比第二种还慢。
      以上仅仅是我的一点看法,没看SQL原理好多年了,好多东西也忘了,错漏之处还请大家多多指教,共同提高。
      

  8.   

    SELECT COL1,MAX(COL2) 
    FROM TBTEST 
    GROUP BY COL1 SELECT COL1,COL2 
    FROM TBTEST T1 
    WHERE COL2=(SELECT MAX(COL2) FROM TBTEST T2 WHERE T2.COL1=T1.COL1 ) 这样的话效率差不多一样
      

  9.   


    ---方法,效果不知道
    SELECT  distinct A.COL1,maxCOL2=(select max(COL2) from guguda2008 where COL1=A.COL1 )
    FROM guguda2008  A