|
|
|
|
你现在的位置:您现在的位置是: 中国ASP>>数据库>>sql server |
|
| 找含匹配列的行 |
|
查找含匹配列的行
//--为col2与col3查找出重复的行
//match_cols表
row_no col2 col3 ------ ---------- ---------- 1 c d 2 a a 3 a d 4 c b 5 c c 6 b c 7 c a 8 c b 9 c d 10 d d
(10 row(s) affected)
方法一:自联结法
对于到大量数据,它的效率不高。
SELECT DISTINCT A.row_no,A.col2,A.col3 FROM match_cols A,match_cols B WHERE A.col2=B.col2 AND A.col3=B.col3 AND A.row_no<>B.row_no ORDER BY A.col2,A.col3
方法二:相关子查询
SELECT A.row_no,A.col2,A.col3 FROM match_cols A WHERE EXISTS(SELECT B.col2,B.col3 FROM match_cols AS B WHERE A.col2=B.col2 AND A.col3=B.col3 GROUP BY B.col2,B.col3 HAVING COUNT(*)>1) ORDER BY A.col2,A.col3
方法三:具体化非唯一的值,然后联结到结果
SELECT col2,col3 INTO #mytemp FROM match_cols GROUP BY col2,col3 HAVING COUNT(*)>1
SELECT #mytemp.col2,#mytemp.col3,#mytemp.row_num FROM #mytemp JOIN match_cols ON(#mytemp.col2=match_cols.col2 AND #mytemp.col3=match_cols.col3) ORDER BY 1,2,3
这种方法速度快。因只有16种可能的组合,因此只有16种出现重复的方式,该临时表也就只包含16行。该临时表就成为该联结的外表。然后对这16行中的每一行扫描(利用索引)一次主表match_cols。这样就不象前面介绍的方法中那样,扫描次数高达5000,而是只扫描16次。这种方法是到现在为止最快的。纯SQL查询最适合这类工作,效率也高。
方法四:使用导出表 使用导出表的效果相当好,处理方法与临时表几乎完全相同。
SELECT A.row_num,A.col2,A.col3 FROM match_cols AS A JOIN (SELECT col2,col3 FROM match_cols AS B GROUP BY col2,col3 HAVING COUNT(*)>1) AS B ON(A.col2=B.col2 AND A.col3=B.col3) ORDER BY A.col2,A.col3,A.row_num
******************************** row_no col2 col3 ------ ---------- ---------- 4 c b 8 c b 1 c d 9 c d
|
|
|