<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    superwei

    導(dǎo)航

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統(tǒng)計(jì)

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    四種聯(lián)系(join)的區(qū)別及用法

    • 鏈接:

    作為動(dòng)詞,它表示將兩個(gè)或多個(gè)表的內(nèi)容結(jié)合在一起并產(chǎn)生一個(gè)結(jié)果集,該結(jié)果集對(duì)每個(gè)表的列和行進(jìn)行合并。表的聯(lián)接一般都使用它們共有的數(shù)據(jù)。例如,您可以對(duì)有一個(gè)共同 pub_id 列的 titles 表和 publishers 表聯(lián)接,產(chǎn)生一個(gè)包含書名信息和出版商信息的結(jié)果集。

    作為名詞,表示對(duì)表進(jìn)行聯(lián)接的過程或結(jié)果,如在術(shù)語"內(nèi)部聯(lián)接"中表示對(duì)表聯(lián)接的一種特殊的方法。

    • 聯(lián)接條件(join condition)

    一個(gè)比較子句,它指定了表是如何通過它們的聯(lián)接字段相聯(lián)系的。最普通的聯(lián)接條件是相等(一個(gè)等聯(lián)接),在等聯(lián)接中聯(lián)接字段的值必須相同。例如,您可以通過在 titles 表和 publishers 表的 pub_id 列中查找相匹配的值聯(lián)接這兩個(gè)表。然而,任何比較運(yùn)算符都可以是比較條件的一部分。

    • 內(nèi)部聯(lián)接(inner join)

    一個(gè)聯(lián)接,在該聯(lián)接中只有當(dāng)聯(lián)接字段的值滿足某些特定的準(zhǔn)則時(shí)才將兩個(gè)表的記錄進(jìn)行結(jié)合并添加到一個(gè)查詢結(jié)果中。例如,在查詢?cè)O(shè)計(jì)器視圖中,表之間的缺省聯(lián)接是一個(gè)內(nèi)部聯(lián)接,它只有當(dāng)聯(lián)接字段的值相等時(shí)才從兩個(gè)表中選擇記錄。

    • 外部聯(lián)接(outer join)

    一個(gè)聯(lián)接,該聯(lián)接還包括那些和聯(lián)接表中記錄不相關(guān)的記錄。您可以創(chuàng)建一個(gè)外部聯(lián)接的三種變形來指定所包括的不匹配行:左外部聯(lián)接、右外部聯(lián)接和完全外部聯(lián)接。

    • 左外部聯(lián)接(left outer join)

    一種外部聯(lián)接類型,在該聯(lián)接中包括第一個(gè)命名表(左邊的表,它出現(xiàn)在 JOIN 子句的最左邊)的所有行。右邊表中沒有匹配的行不出現(xiàn)。例如,您可以在 titles 表和 publishers 表之間創(chuàng)建一個(gè)左外部聯(lián)接,以包括所有的書名,不論書名有無出版商的信息。

    • 右外部聯(lián)接(right outer join)

    一種外部聯(lián)接,在該聯(lián)接中包括第二個(gè)命名表(右邊的表,出現(xiàn)在 JOIN 子句中的最右邊)的所有行。不包括左邊表中沒有匹配的行。例如,titles 表和 publishers 表之間的一個(gè)右外部聯(lián)接將包括所有的出版商,甚至包括那些在 titles 表中沒有書名的出版商。

    以上是MSDN中對(duì)鏈接的定義。現(xiàn)在我們就從這四種鏈接所使用的不同方法來看他們的結(jié)果有什么不同。

    titles 表sh(書號(hào))		ph(出版商編號(hào))232342		0010432		00382478123	005

    publishers 表
    ph(出版商編號(hào)) mc(出版商名稱)
    001 紅虎
    002 rmh
    003 hazl

    現(xiàn)要把這兩個(gè)表的內(nèi)容合成如下的表結(jié)構(gòu):

    sh(書號(hào))    ph(出版商編號(hào))        mc(出版商名稱)

    現(xiàn)在看看采用四種鏈接方法的結(jié)果會(huì)有什么不同。先說說他們的命令:

    內(nèi)聯(lián)接:
    sele titles.sh,publishers.ph,publishers.mc ;
    ? from titles inner join publishers ;??? &&內(nèi)聯(lián)接中的inner是可以省略的
    ??? on titles.ph=publishers.ph

    外聯(lián)接:
    sele titles.sh,publishers.ph,publishers.mc ;
    ? from titles outer join publishers ;
    ??? on titles.ph=publishers.ph

    左聯(lián)接:
    sele titles.sh,publishers.ph,publishers.mc ;
    ? from titles left join publishers ;
    ??? on titles.ph=publishers.ph

    右聯(lián)接:
    sele titles.sh,publishers.ph,publishers.mc ;
    ? from titles right join publishers ;
    ??? on titles.ph=publishers.ph

    大家可能看到,除了在join之前的那個(gè)關(guān)鍵字不同之外,其他地方是一模一樣的,鏈接條件(即on那一部分)也是一樣的。結(jié)果:

    內(nèi)鏈接:

    232342		001	紅虎0432		003	hazl

    全鏈接:

    232342		001	001	紅虎Null		Null	002	rmh0432		003	003	hazl82478123	005	Null	Null

    左鏈接:

    232342		001	001	紅虎0432		003	003	hazl82478123	005	Null	Null

    右鏈接:

    232342		001	001	紅虎Null		Null	002	rmh0432		003	003	hazl

    所以我們很容易記住:

    1、左鏈接:就是以join的左邊那個(gè)表為"主",以titles.ph=publishers.ph為判斷標(biāo)準(zhǔn),不管右邊的表有沒有對(duì)應(yīng)的記錄,都要把左邊表的記錄放在結(jié)果中去,但右邊表沒有相應(yīng)的記錄那應(yīng)該放個(gè)什么數(shù)值進(jìn)去?答案是就放個(gè)Null,表示沒有。在左鏈接中,某記錄在右邊表,卻不在左邊表,那是不放進(jìn)去結(jié)果去的,原因是左邊表才是"主",要不要放由它決定:它有的,就一定放進(jìn)去,它沒有的,就不要了。

    2、右鏈接:和左鏈接一樣,只不過為"主"的一方調(diào)過來了,換成是由右邊做"主"。

    3、內(nèi)鏈接:和左、右鏈接不同,它一定要左、右兩邊都有的記錄才會(huì)放進(jìn)結(jié)果,如果有某個(gè)記錄不存在于任何一邊,那這個(gè)記錄是不會(huì)出現(xiàn)在結(jié)果中去的。

    4、外鏈接:跟內(nèi)聯(lián)接相,反,相當(dāng)于左、右鏈接的合并:不管什么情況,只要某個(gè)記錄出現(xiàn)在這兩個(gè)表,就一定會(huì)出現(xiàn)在結(jié)果中去,然后象左、右鏈接的處理方法一樣,用Null來填充沒有對(duì)應(yīng)值的字段。

    注:以上說的"有"、"沒有",意思是以titles.ph=publishers.ph為判斷標(biāo)準(zhǔn)來下決定的。比如當(dāng)前titles表的ph是"002",而在publishers中,沒有一個(gè)記錄的ph的值是"002"的,所以就說"002"這個(gè)值在titles有,在publisher中沒有,這樣titles.ph為"002"的記錄就會(huì)被選中,最后放在結(jié)果中去。

    大家如果想一下,這個(gè)on的作用跟where、having似乎有點(diǎn)類似,都是起到過濾的作用:根據(jù)條件選取所取的記錄,而根據(jù)命令的工作流程,這個(gè)on是比where、having都要早執(zhí)行的,而它里面的條件表達(dá)式又不一定是titles.ph=publishers.ph的形式,還可以繼續(xù)擴(kuò)充,變成一個(gè)很復(fù)雜的條件表達(dá)式,從而完成一個(gè)很有效的、where和having都不能實(shí)現(xiàn)的過濾功能。具體的比較請(qǐng)看 on、where、having的區(qū)別 一節(jié)。

    剛才舉的例子,表中的ph都是沒有重復(fù)的。現(xiàn)在以內(nèi)聯(lián)接為例,舉個(gè)判斷字段中內(nèi)容有重復(fù)的例子:

    Temp1		temp2Aa		aa1		11		22		23		2
    sele temp1.aa,temp2.aa ;  from temp1 join temp2 ;    on temp1.aa=temp2.aa

    運(yùn)行結(jié)果是:

    1	11	12	22	22	2

    很明顯,有些記錄重復(fù)了幾遍。temp1.aa中的雖然只有1個(gè)2,但temp2.aa有3個(gè)2,所以結(jié)果就會(huì)有1*3=3個(gè)2了。如果temp1.aa而2個(gè)2的話,那結(jié)果就會(huì)有2*3=6個(gè)2了。

    知道了這一點(diǎn),在做多表鏈接查詢的時(shí)候很有用。你要考慮第一、二個(gè)鏈接后的結(jié)果跟第三個(gè)表鏈接時(shí),會(huì)不會(huì)出現(xiàn)這種情況?如果有,那是不是你想要的?如果有,那怎么處理?有些朋友說做這個(gè)命令的結(jié)果中有些記錄會(huì)比正確的結(jié)果大幾倍,就要看看是不是出現(xiàn)了這種重復(fù)算的情況。

    學(xué)會(huì)了鏈接,在開始做之前,先要說一個(gè)很重要的問題:在視圖設(shè)計(jì)器來看多個(gè)表的聯(lián)接關(guān)系,它們之間的鏈接是用一條線連接起來的,看起來就象一串糖葫蘆。如果一個(gè)表同時(shí)和三個(gè)表聯(lián)接,那看起來就象一支分叉的樹枝了,那這種情況結(jié)果就不對(duì)了。大家可能不明白我在說什么,我舉個(gè)例子大家就會(huì)明白了。

    有一個(gè)產(chǎn)品表、一個(gè)進(jìn)貨明細(xì)表、一個(gè)出貨明細(xì)表,現(xiàn)在的要求是要求產(chǎn)品表中所有的產(chǎn)品的進(jìn)、出情況,也就是把三個(gè)表象join命令那樣合成一個(gè)表,如果沒有相應(yīng)的進(jìn)、出記錄,也照樣列出來但不計(jì)較null值。剛開始學(xué)的朋友很可就會(huì)這樣做:

    1、 在設(shè)計(jì)器里添加這三個(gè)表;

    2、 然后用產(chǎn)品表中的產(chǎn)品編號(hào)分別與其它二個(gè)表左鏈接,這樣產(chǎn)品表中就有二個(gè)鏈接(也就是二條線了);

    3、 然后把三個(gè)表的字段都做為輸出字段。

    但結(jié)果呢?不對(duì)。只有一個(gè)表的記錄出現(xiàn)在結(jié)果中,即使把四種鏈接類型都試一下,結(jié)果都是不對(duì)的。

    為什么呢?我估計(jì)是以下原因:如果產(chǎn)品表只與進(jìn)貨表鏈接的話,系統(tǒng)根據(jù)產(chǎn)品表和進(jìn)貨表的聯(lián)接關(guān)系,以產(chǎn)品表為左表,和進(jìn)貨這個(gè)右表組成一個(gè)臨時(shí)結(jié)果,然后又以臨時(shí)表為左表,再去找進(jìn)貨表的右邊表。而進(jìn)貨表的右邊沒有表,這時(shí)系統(tǒng)就停止鏈接,交給where去過濾了。但現(xiàn)在產(chǎn)品表同時(shí)跟二個(gè)表左聯(lián)接,系統(tǒng)會(huì)自動(dòng)選其中一個(gè)先進(jìn)行鏈接,鏈接結(jié)果出來后,這個(gè)臨時(shí)結(jié)果的右邊就沒有表了,系統(tǒng)就停止鏈接動(dòng)作了。剩下的出貨表、退貨表都還沒鏈接,所以那個(gè)表等于沒用。

    解決的方法是:進(jìn)貨表用進(jìn)貨表的產(chǎn)品編號(hào)全鏈接產(chǎn)品表,然后產(chǎn)品表又用產(chǎn)品表的產(chǎn)品編號(hào)全鏈接出貨表,進(jìn)、貨表的順序可以調(diào)過來,但產(chǎn)品表一定要在中間,且兩個(gè)鏈接類型都是全鏈接,否則結(jié)果都不對(duì)。這樣的鏈接情況,在設(shè)計(jì)器里按鏈接中的各個(gè)表的左右順序排起來,很直觀的:就是一串!沒有分叉。這個(gè)方法的實(shí)現(xiàn)過程就是:

    進(jìn)貨表全鏈接產(chǎn)品表,即使某種產(chǎn)品沒有進(jìn)貨,但得出來的結(jié)果也一樣有這個(gè)記錄,只是它的進(jìn)貨內(nèi)容是null值。然后這個(gè)臨時(shí)結(jié)果又跟出貨表全鏈接,這次的結(jié)果就前一步差不多,有出貨內(nèi)容的記錄就有出貨數(shù)量,否則就是null值。因?yàn)闆]有分叉,所以全部表都鏈接進(jìn)去了,結(jié)果也就對(duì)了(當(dāng)然如果鏈接類型錯(cuò)了,結(jié)果也是不對(duì)的)。

    看了剛才那個(gè)問題之后,還有一個(gè)問題也要說一下。在剛才那個(gè)例子中,如果產(chǎn)品表中某個(gè)產(chǎn)品編號(hào)出現(xiàn)了重復(fù),有N個(gè)記錄的編號(hào)相同,而在進(jìn)貨表里這個(gè)編號(hào)的記錄也出現(xiàn)M個(gè),這樣一來,結(jié)果就有點(diǎn)不同了。首先在進(jìn)貨表跟產(chǎn)品表的全鏈接結(jié)果里,這個(gè)編號(hào)就會(huì)出現(xiàn)N*M次,就不是一次了。然后這個(gè)臨時(shí)表再去跟出貨表全鏈接時(shí),即使這個(gè)編號(hào)在出貨表里出現(xiàn)一次,但在最后的鏈接結(jié)果中,這個(gè)編號(hào)還是會(huì)出現(xiàn)N*M次,那它的出貨記錄也重復(fù)了N*M次了。如果現(xiàn)在要sum()出貨記錄的話,那出貨數(shù)量就會(huì)放大了N*M倍了,進(jìn)貨記錄也不準(zhǔn)了。所以如果產(chǎn)品表中的編號(hào)有重復(fù)的話,那結(jié)果就很可能會(huì)不對(duì)了。

    但產(chǎn)品表的編號(hào)沒有重復(fù),那結(jié)果就一定會(huì)正確呢?也未必。大家試一下,假設(shè)進(jìn)貨表和產(chǎn)品表的編號(hào)"001"都是只出現(xiàn)一次,但出貨表中就出現(xiàn)了二次。那最后的結(jié)果中"001"還是出現(xiàn)了二次,二次的產(chǎn)品名稱、進(jìn)貨數(shù)量都是相同的,只是出貨數(shù)量不同而已。如果這時(shí)sum(),結(jié)果還是不對(duì)。

    所以如果想在多表鏈接后進(jìn)行sum()之類的匯總操作,使用以上的方法是不行的。解決方法是使用union,用它來將進(jìn)貨的匯總情況跟出貨的匯總情況合起來,從而避免互相干擾。

    另注:3個(gè)表之間的連接

    eg:????? select a.* b.field1,c.field2 from table a left outer jion table b on a,field1=b.field1 left outer join table?c on a.field2=c.field2

    posted on 2007-02-09 12:00 小辭猬 閱讀(445) 評(píng)論(0)  編輯  收藏 所屬分類: DataBase

    主站蜘蛛池模板: 国产午夜亚洲精品午夜鲁丝片| 国产成人免费一区二区三区| 国精无码欧精品亚洲一区| 一级做a爱过程免费视频高清| 国产在线观看免费视频播放器| 亚洲欧美国产精品专区久久| 成年人免费观看视频网站| 亚洲三级高清免费| 在线jlzzjlzz免费播放| 国产午夜亚洲精品不卡免下载| 国产一级做a爱免费视频| 免费一级毛suv好看的国产网站| 亚洲成AⅤ人影院在线观看| h视频免费高清在线观看| 亚洲精品无码久久千人斩| 日本免费中文字幕| 亚洲成aⅴ人片在线影院八| 岛国av无码免费无禁网站| 亚洲人成网亚洲欧洲无码| 亚洲精品国精品久久99热| 免费看无码特级毛片| 亚洲天堂一区二区| 中文字幕影片免费在线观看| 色婷婷亚洲一区二区三区| 中文亚洲AV片不卡在线观看| 在线免费观看你懂的| 亚洲欧美日韩综合俺去了| 亚洲一级Av无码毛片久久精品| 久久午夜夜伦鲁鲁片免费无码 | 午夜免费啪视频在线观看| 亚洲熟妇av一区| 一本色道久久88综合亚洲精品高清| 九九热久久免费视频| 亚洲理论片中文字幕电影| 免费在线一级毛片| 69国产精品视频免费| 日本黄页网址在线看免费不卡| 亚洲五月激情综合图片区| 国产色爽免费视频| 84pao强力永久免费高清| 看免费毛片天天看|