Oracle minus用法詳解及應(yīng)用實(shí)例
Oracle minus用法
“minus”直接翻譯為中文是“減”的意思,在Oracle中也是用來(lái)做減法操作的,只不過(guò)它不是傳統(tǒng)意義上對(duì)數(shù)字的減法,而是對(duì)查詢結(jié)果集的減法。A minus B就意味著將結(jié)果集A去除結(jié)果集B中所包含的所有記錄后的結(jié)果,即在A中存在,而在B中不存在的記錄。其算法跟Java中的Collection的removeAll()類似,即A minus B將只去除A跟B的交集部分,對(duì)于B中存在而A中不存在的記錄不會(huì)做任何操作,也不會(huì)拋出異常。
Oracle的minus是按列進(jìn)行比較的,所以A能夠minus B的前提條件是結(jié)果集A和結(jié)果集B需要有相同的列數(shù),且相同列索引的列具有相同的數(shù)據(jù)類型。此外,Oracle會(huì)對(duì)minus后的結(jié)果集進(jìn)行去重,即如果A中原本多條相同的記錄數(shù)在進(jìn)行A minus B后將會(huì)只剩一條對(duì)應(yīng)的記錄,具體情況請(qǐng)看下面的示例。
下面我們來(lái)看一個(gè)minus實(shí)際應(yīng)用的示例,假設(shè)我們有一張用戶表t_user,其中有如下記錄數(shù)據(jù):
|
id |
no |
name |
age |
level_no |
|
1 |
00001 |
a |
25 |
1 |
|
2 |
00002 |
b |
30 |
2 |
|
3 |
00003 |
c |
35 |
3 |
|
4 |
00004 |
d |
45 |
1 |
|
5 |
00005 |
e |
30 |
2 |
|
6 |
00006 |
f |
35 |
3 |
|
7 |
00007 |
g |
25 |
1 |
|
8 |
00008 |
h |
35 |
2 |
|
9 |
00009 |
i |
20 |
3 |
|
10 |
00010 |
j |
25 |
1 |
那么:
(1)“select id from t_user where id<6 minus select id from t_user where id between 3 and 7”的結(jié)果將為:
|
id |
|
1 |
|
2 |
(2)“select age,level_no from t_user where id<8 minus select age,level_no from t_user where level=3”的結(jié)果為:
|
age |
level_no |
|
25 |
1 |
|
30 |
2 |
|
45 |
1 |
看到這樣的結(jié)果,可能你會(huì)覺(jué)得有點(diǎn)奇怪,為何會(huì)是這樣呢?我們來(lái)分析一下。首先,“select age,level_no from t_user where id<8”的結(jié)果將是這樣的:
|
age |
level_no |
|
25 |
1 |
|
30 |
2 |
|
35 |
3 |
|
45 |
1 |
|
30 |
2 |
|
35 |
3 |
|
25 |
1 |
然后,“select age,level_no from t_user where level=3”的結(jié)果將是這樣的:
|
age |
level_no |
|
35 |
3 |
|
35 |
3 |
|
20 |
3 |
然后,直接A minus B之后結(jié)果應(yīng)當(dāng)是:
|
age |
level_no |
|
25 |
1 |
|
30 |
2 |
|
45 |
1 |
|
30 |
2 |
|
25 |
1 |
這個(gè)時(shí)候,我們可以看到結(jié)果集中存在重復(fù)的記錄,進(jìn)行去重后就得到了上述的實(shí)際結(jié)果。其實(shí)這也很好理解,因?yàn)閙inus的作用就是找出在A中存在,而在B中不存在的記錄。
上述示例都是針對(duì)于單表的,很顯然,使用minus進(jìn)行單表操作是不具備優(yōu)勢(shì)的,其通常用于找出A表中的某些字段在B表中不存在對(duì)應(yīng)記錄的情況。比如我們擁有另外一個(gè)表t_user2,其擁有和t_user表一樣的表結(jié)構(gòu),那么如下語(yǔ)句可以找出除id外,在t_user表中存在,而在t_user2表中不存在的記錄。
select no,name,age,level_no from t_user minus select no,name,age,level_no from t_user2;
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
WIN7下ORACLE10g服務(wù)端和客戶端的安裝圖文教程
WIN7下安裝ORACLE10gd的服務(wù)端和客戶端的方法,在安裝之前需要先卸載oracle 10g,具體安裝方法和詳細(xì)說(shuō)明大家可以參考下本文2017-07-07
使用springboot暴露oracle數(shù)據(jù)接口的問(wèn)題
這篇文章主要介紹了使用springboot暴露oracle數(shù)據(jù)接口的問(wèn)題,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
Oracle數(shù)據(jù)庫(kù)安全策略分析(一)
Oracle數(shù)據(jù)庫(kù)安全策略分析(一)...2007-03-03
ORACLE數(shù)據(jù)庫(kù)對(duì)long類型字段進(jìn)行模糊匹配的解決思路
這篇文章主要介紹了ORACLE數(shù)據(jù)庫(kù)對(duì)long類型字段進(jìn)行模糊匹配的解決思路,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Oracle的CLOB大數(shù)據(jù)字段類型操作方法
VARCHAR2既分PL/SQL Data Types中的變量類型,也分Oracle Database中的字段類型,不同場(chǎng)景的最大長(zhǎng)度不同。接下來(lái)通過(guò)本文給大家分享Oracle的CLOB大數(shù)據(jù)字段類型操作方法,感興趣的朋友一起看看吧2017-08-08
[Oracle] 解析在沒(méi)有備份的情況下undo損壞怎么辦
Oracle在運(yùn)行中很不幸遇到undo損壞,當(dāng)然最好的方法是完全恢復(fù),但如果是在沒(méi)有備份的情況下undo損壞怎么辦?以下就為大家介紹出現(xiàn)這種情況的解決辦法,需要的朋友參考下2013-07-07
Oracle數(shù)據(jù)庫(kù)的啟動(dòng)與關(guān)閉方法
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)的啟動(dòng)與關(guān)閉方法,需要的朋友可以參考下2013-07-07

