诚心诚意地求教
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)这两种方法得到结果。
哪种更快?为什么?或者还有什么更好的办法?
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)这两种方法得到结果。
哪种更快?为什么?或者还有什么更好的办法?
SELECT COL1,MAX(COL2)
FROM TB
GROUP BY COL1 的效率高 具体看执行计划
看到EXISTS,我就毫不犹豫的选择了第1种----------
在SQL2000以前,一般不要用如下的字句: "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE '%500'",因为他们不走索引全是表扫描。
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 更有优势。
原因:1、使用NOT EXISTS;
2、使用嵌套函数,能直接执行的,尽量不使用嵌套函数。
至于效率更高的查询方法,我没想到。至于join查询,我觉得把一张表利用笛卡尔集的方式联合后查询的效率可能比第二种还慢。
以上仅仅是我的一点看法,没看SQL原理好多年了,好多东西也忘了,错漏之处还请大家多多指教,共同提高。
FROM TBTEST
GROUP BY COL1 SELECT COL1,COL2
FROM TBTEST T1
WHERE COL2=(SELECT MAX(COL2) FROM TBTEST T2 WHERE T2.COL1=T1.COL1 ) 这样的话效率差不多一样
---方法,效果不知道
SELECT distinct A.COL1,maxCOL2=(select max(COL2) from guguda2008 where COL1=A.COL1 )
FROM guguda2008 A