計算機(jī)二級VF輔導(dǎo):union的使用

字號:

第四節(jié) union的使用
    union可以將幾條SQL命令合成一條,要求是這幾條命令生成的表,在字段個數(shù)、字段類型、字段長度、字段順序上都完全一樣。以下這種情況,一般都要使用它的:
    把幾個結(jié)構(gòu)完全一樣的表的記錄都加在一起,最后生成的表,在結(jié)構(gòu)上跟那幾個表也完全一樣,但記錄數(shù)就是那幾個表的記錄數(shù)的總和。
    舉個例子:我想統(tǒng)計一段時間內(nèi)的提貨、進(jìn)貨情況,最后生成的表是這樣的:
    產(chǎn)品編號(cpbh) 產(chǎn)品名稱(cpmc) 提貨數(shù)量(thsl) 進(jìn)貨數(shù)量(jhsl)
    先用二條命令分別計算提貨數(shù)量和進(jìn)貨數(shù)量,生成二個臨時表,最后用union合成一個表。
    sele thdmx.cpbh,sum(iif(isnull(thsl),0,thsl)) as thsl;
     from cpk left join thdmx ;
     on cpk.cpbh=thdmx.cpbh ;
     grou by cpbh ;
     into curs temp1
    sele jhdmx.cpbh,sum(iif(isnull(jhsl),0,jhsl)) as jhsl;
     from cpk left join jhdmx ;
     on cpk.cpbh=jhdmx.cpbh ;
     grou by cpbh ;
     into curs temp2
    現(xiàn)在temp1和temp2的格式跟最后的結(jié)果有點(diǎn)不同,都是少了一個提貨數(shù)量(進(jìn)貨數(shù)量),不能直接使用union聯(lián)合。所以我們要人為給每個臨時表加個對應(yīng)的字段,命令如下:
    sele cpbh,thsl,10000-10000 as jhsl ;
     from temp1 ;
    union ;
    sele cpbh,0 ,jhsl ;
     from temp2 ;
     into curs temp3
    在每節(jié)SQL命令,都加了一個字段,它的值都是零(沒有嘛,當(dāng)然是零啦)。這樣一樣,每節(jié)SQL命令生成的表在結(jié)構(gòu)上就完全一樣了,就可以使用union了。大家試一下,如果都不加個字段的話,那雖然不會出錯,但結(jié)果的結(jié)構(gòu)就跟要求不一樣了。
    在上面那條命令,每一節(jié)都可以使用"as"來給字段重新起名。如果在第一節(jié)使用了"as",則以后的則可能不用了。否則的話,就是最后使用"as"的那節(jié)才起作用,前面的都無效了。
    temp3出來了,就可以使用分級合并了。
    sele cpbh,sum(thsl) as thsl,sum(jhsl) as jhsl ;
     from temp3 ;
     grou by cpbh ;
     into curs temp4
    現(xiàn)在這個temp4就是最后正確的結(jié)果了。
    做了這么多步,大家應(yīng)該明白這類聯(lián)合統(tǒng)計的命令是怎樣做的吧。但精于求精的我們是不會滿足的,還可以對上面的那么多個步驟進(jìn)行簡化:
    sele thdmx.cpbh,sum(iif(isnull(thsl),0,thsl)) as thsl,10000-10000 as jhsl;
     from cpk left join thdmx ;
     on cpk.cpbh=thdmx.cpbh ;
     grou by cpbh ;
    union ;
    sele jhdmx.cpbh,0, sum(iif(isnull(jhsl),0,jhsl)) ;
     from cpk left join jhdmx ;
     on cpk.cpbh=jhdmx.cpbh ;
     grou by cpbh ;
     into curs temp1
    sele cpbh,sum(thsl) as thsl,sum(jhsl) as jhsl ;
     from temp1 ;
     grou by cpbh ;
     into curs temp2
    大家看一下,使用了union是不是更簡潔了?這里只統(tǒng)計進(jìn)、出情況,如果再加上退、報廢等情況,采用第一種方法就要使用五條命令,產(chǎn)生6個臨時表。而采用第二種方法,無論再加多少種情況,都只需2條命令和2個臨時表就可以。
    只要記住union中每節(jié)SQL命令產(chǎn)生的結(jié)果中,字段個數(shù)、字段類型、字段長度、字段順序上都完全一樣的,才能進(jìn)行聯(lián)合。
    而在分析一段很長的、又使用了union的SQL命令,可以按union分成一條一條SQL命令,然后再去分析每一條SQL命令,看每條命令是什么表采用什么鏈接類型進(jìn)行鏈接,過濾條件是什么,按什么進(jìn)行分組,進(jìn)行什么樣的字段匯總函數(shù)。只要懂得了SQL命令的工作流程順序,再復(fù)雜的SQL命令都可以很快就看明白。