1. 程式人生 > >多個欄位的in 和 not in 及其替代寫法(exists,not exists)

多個欄位的in 和 not in 及其替代寫法(exists,not exists)

【轉載】


先說基本情況:


資料庫:DB2 8.2,SQL Server 2005 Express

表a  有欄位:aaa,bbb,還可能有其他欄位。記錄條數:3764

表b  有欄位:aaa,bbb,還可能有其他欄位。記錄條數:4127

就是表a的欄位aaa跟表b的欄位aaa有對應關係,表a欄位的bbb跟表b的欄位bbb有對應關係。

要求只有aaa,bbb兩個欄位都同時對應上了才算是真的對應上了。(也不知道我說的清不清楚,理解萬歲啊)




好了,開始正文:

如下語句就是我們想要的結果:

select * from b where (aaa,bbb)  in ( select aaa,bbb from a );

不過很可惜,上面的語句在某些資料庫中不支援

還好可以用下面的語句來代替

select * from b where exists ( select * from a where a.aaa=b.aaa and a.bbb=b.bbb);




下面就幾個方面比較一下吧(雖然意義不是很大,呵呵)

寫法上:

當然是in、not in最直觀了(地球人都知道)。


再說效率問題(DB2下測試):

in效率比exists高

not exists效率比not in高


具體執行時間如下:

in      0.01 secs

exists  0.03 secs

not in      8.62 secs

not exists  0.03 secs



總結:

       多欄位in、not in在db2資料中可以執行,SQL Server不行。(其他資料庫沒有試過,不知道!)


       exists、not exists在db2,SQL Server均可執行。(其他資料庫沒有試過,不知道!)


       而且總體上用exists,not exists 效率都很高,建議大家還是用好exists,not exists吧!