程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 找含匹配列的行

找含匹配列的行

編輯:關於SqlServer

查找含匹配列的行

//--為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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved