查找含匹配列的行
//--為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