天天看點

多個字段的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吧!