sqlserver嵌套查詢語句中使用in或者exists的場景和原則如下:
鲅魚圈網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),鲅魚圈網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為鲅魚圈1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的鲅魚圈做網(wǎng)站的公司定做!
如果查詢的兩個(gè)表大小相當(dāng),那么用in和exists差別不大。兩者都可以使用。
in 是把外表和內(nèi)表作hash 連接,而exists是對(duì)外表作loop循環(huán),每次loop循環(huán)再對(duì)內(nèi)表進(jìn)行查詢。所以當(dāng)有多重循環(huán),使用in更合適,效率越高。
如果兩個(gè)表中一個(gè)較小,一個(gè)是大表,則子查詢表大的用exists,子查詢表小的用in。
NOT EXISTS,exists的用法跟in不一樣,一般都需要和子表進(jìn)行關(guān)聯(lián),而且關(guān)聯(lián)時(shí),需要用索引,這樣就可以加快速度。
嵌套表
br
br一、嵌套表的定義:
br
br 嵌套表是表中之表。一個(gè)嵌套表是某些行的集合,它在主表中表示為其中的一列。對(duì)主表中的每一條記錄,嵌套表可以包含多個(gè)行。在某種意義上,它是在一個(gè)表中存儲(chǔ)一對(duì)多關(guān)系的一種方法??疾橐粋€(gè)包含部門信息的表,在任何時(shí)間內(nèi)每個(gè)部門會(huì)有很多項(xiàng)目正在實(shí)施。在一個(gè)嚴(yán)格的關(guān)系模型中,將需要建立兩個(gè)獨(dú)立的表department和project。
br
br 嵌套表允許在department表中存放關(guān)于項(xiàng)目的信息。勿需執(zhí)行聯(lián)合操作,就可以通過department表直接訪問項(xiàng)目表中的記錄。這種不經(jīng)聯(lián)合而直接選擇數(shù)據(jù)的能力使得用戶對(duì)數(shù)據(jù)訪問更加容易。甚至在并沒有定義方法來訪問嵌套表的情況下,也能夠很清楚地把部門和項(xiàng)目中的數(shù)據(jù)聯(lián)系在一起。在嚴(yán)格的關(guān)系模型中,department和project兩個(gè)表的聯(lián)系需要通過外部關(guān)鍵字(外鍵)關(guān)系才能實(shí)現(xiàn)。
br
br
br二、舉例說明嵌套表的使用:
br
br 假設(shè)有一個(gè)關(guān)于動(dòng)物飼養(yǎng)員的表,希望其中具有他們飼養(yǎng)的動(dòng)物的信息。用一個(gè)嵌套表,就可以在同一個(gè)表中存儲(chǔ)飼養(yǎng)員和其飼養(yǎng)的全部動(dòng)物的信息。
br
br1、創(chuàng)建類型animal_ty:此類型中,對(duì)于每個(gè)動(dòng)物都包含有一個(gè)記錄,記載了其品種、名稱和出生日期信息。
br
brCREATE TYPE animal_ty AS OBJECT (
br
brbreed varchar2(25),
br
brname varchar2(25),
br
brbirthdate date);
br
br2、創(chuàng)建animals_nt:此類型將用作一個(gè)嵌套表的基礎(chǔ)類型。
br
brCREATE TYPE animals_nt as table of animal_ty;
br
br3、創(chuàng)建表breeder:飼養(yǎng)員的信息表
br
brcreate table breeder
br
br(breedername varchar2(25),
br
branimals animal_nt)
br
brnested table animals store as animals_nt_tab;
br
br4、向嵌套表中插入記錄
br
brinsert into breeder
br
brvalues('mary',animal_nt(animal_ty('dog','butch','31-MAR-97'),
br
branimal_ty('dog','rover','31-MAR-97'),
br
branimal_ty('dog','julio','31-MAR-97')));
br
brinsert into breeder
br
brvalues('jane',animal_nt(animal_ty('cat','an','31-MAR-97'),
br
branimal_ty('cat','jame','31-MAR-97'),
br
branimal_ty('cat','killer','31-MAR-97')));
br
brcommit;
br
br5、查詢嵌套表
br
brselect name,birthdate from
br
brtable(select animals from breeder);
br
brselect name,birthdate from
br
brtable(select animals from breeder
br
brwhere breedername=’mary’)
br
brwhere name=’dog’;
br
br三、嵌套表的特點(diǎn):
br
br1、對(duì)象復(fù)用:如果編寫面向?qū)ο蟮拇a,就提高了重用以前編寫的代碼模塊的機(jī)會(huì)。同樣,如果創(chuàng)建面向?qū)ο蟮臄?shù)據(jù)庫對(duì)象,也就提高了數(shù)據(jù)庫對(duì)象能夠被重用的機(jī)會(huì)。
br
br2、標(biāo)準(zhǔn)支持:如果創(chuàng)建標(biāo)準(zhǔn)的對(duì)象,那么它們被重用的機(jī)會(huì)就會(huì)提高。如果有多個(gè)應(yīng)用或多個(gè)表使用同一數(shù)據(jù)庫對(duì)象集合,那么它就是既成事實(shí)的數(shù)據(jù)庫對(duì)象標(biāo)準(zhǔn)。
br
br3、定義訪問路徑:對(duì)于每一個(gè)對(duì)象,用戶可定義在其上運(yùn)行的過程和函數(shù),從而可以使數(shù)據(jù)和訪問此數(shù)據(jù)的方法聯(lián)合起來。有了用這種方式定義的訪問路徑,就可以標(biāo)準(zhǔn)化數(shù)據(jù)訪問的方法并提高對(duì)象的可復(fù)用性。
正常循環(huán)有兩類循環(huán),普通循環(huán)和游標(biāo)循環(huán)
普通循環(huán):while,for ,WHILE LOOP
游標(biāo)循環(huán):針對(duì)你select出來的值進(jìn)行循環(huán)
除了上述那些還有復(fù)活形的多游標(biāo),嵌套循環(huán)等。
sqlserver中事務(wù)可以無限嵌套,全局變量@@TranCount會(huì)自動(dòng)統(tǒng)計(jì)開啟的事務(wù)數(shù)量,每一次Begin Transaction都會(huì)引起@@TranCount加1。而每一次Commit Transaction都會(huì)使@@TranCount減1,而RollBack Transaction會(huì)回滾所有的嵌套事務(wù)包括已經(jīng)提交的事務(wù)和未提交的事務(wù),而使@@TranCount置0。
至于具體為什么可以嵌套如此多的事務(wù),我說不清呀
select 的命令比較多了,常用的是select 表的列名 from 表名/視圖 [where 條件 group by 字段 order by 表的列名 asc/desc],當(dāng)然也可以實(shí)現(xiàn)多表關(guān)聯(lián),select * from a,b where a.列名=b.列名 ;
當(dāng)然select 可以嵌套,但必須數(shù)據(jù)庫支持,sqlserver2000,oracle和mysql5.0以上都支持了,如 select * from (select * from 表名)a ,select的嵌套是比較復(fù)雜,可以實(shí)現(xiàn)n重嵌套的。
select 還有特殊的用法就是select * into 表名 select * from 表名
即為表的復(fù)制,好像sqlserver支持這個(gè)的。
子查詢比較復(fù)雜,你可以看看一些參考書
知道的就這么多了,應(yīng)該還有其他的了。
產(chǎn)生“超出觸發(fā)器的最大嵌套層數(shù)”的原因是因?yàn)閮蓚€(gè)建在同一個(gè)表上的觸發(fā)器均會(huì)更新當(dāng)前表所引起,因?yàn)閟ql server中缺省狀態(tài)的設(shè)置是不啟用遞歸觸發(fā),就是說本表的觸發(fā)器內(nèi)更改本表記錄時(shí),不在觸發(fā)該觸發(fā)器。但是在這里,LZ使用了兩觸發(fā)器,他們相互之間是可以觸發(fā)的,而且兩個(gè)觸發(fā)器都修改了本表記錄,導(dǎo)致觸發(fā)器更新記錄時(shí)出發(fā)了另一觸發(fā)器,而另一觸發(fā)器運(yùn)行時(shí)再次觸發(fā)本觸發(fā)器,如此循環(huán),最終導(dǎo)致錯(cuò)誤“超出觸發(fā)器的最大嵌套層數(shù)”!
如果不是這種循環(huán),應(yīng)該不用考慮最大嵌套層數(shù)。
本文名稱:sqlserver嵌套循環(huán),數(shù)據(jù)庫嵌套循環(huán)
網(wǎng)站網(wǎng)址:http://sd-ha.com/article34/hdhise.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)、電子商務(wù)、微信小程序、品牌網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)