union說明

union可以將幾條SQL命令合成一條,要求是這幾條命令生成的表,在字段個數、字段類型、字段長度、字段順序上都完全一樣。以下這種情況,一般都要使用它的:

把幾個結構完全一樣的表的記錄都加在一起,最後生成的表,在結構上跟那幾個表也完全一樣,但記錄數就是那幾個表的記錄數的總和。

舉個例子:我想統計一段時間內的提貨、進貨情況,最後生成的表是這樣的:

產品編號(cpbh) 產品名稱(cpmc) 提貨數量(thsl) 進貨數量(jhsl)

先用二條命令分別計算提貨數量和進貨數量,生成二個臨時表,最後用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

現在temp1和temp2的格式跟最後的結果有點不同,都是少了一個提貨數量(進貨數量),不能直接使用union聯合。所以我們要人爲給每個臨時表加個對應的字段,命令如下:

sele cpbh,thsl,10000-10000 as jhsl ;
  from temp1 ;
union ;
sele cpbh,0   ,jhsl ;
  from temp2 ;
  into curs temp3

在每節SQL命令,都加了一個字段,它的值都是零(沒有嘛,當然是零啦)。這樣一樣,每節SQL命令生成的表在結構上就完全一樣了,就可以使用union了。大家試一下,如果都不加個字段的話,那雖然不會出錯,但結果的結構就跟要求不一樣了。

在上面那條命令,每一節都可以使用"as"來給字段重新起名。如果在第一節使用了"as",則以後的則可能不用了。否則的話,就是最後使用"as"的那節才起作用,前面的都無效了。

temp3出來了,就可以使用分級合併了。

sele cpbh,sum(thsl) as thsl,sum(jhsl) as jhsl ;
  from temp3 ;
  grou by cpbh ;
  into curs temp4

現在這個temp4就是最後正確的結果了。

做了這麼多步,大家應該明白這類聯合統計的命令是怎樣做的吧。但精於求精的我們是不會滿足的,還可以對上面的那麼多個步驟進行簡化:

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是不是更簡潔了?這裏只統計進、出情況,如果再加上退、報廢等情況,採用第一種方法就要使用五條命令,產生6個臨時表。而採用第二種方法,無論再加多少種情況,都只需2條命令和2個臨時表就可以。

只要記住union中每節SQL命令產生的結果中,字段個數、字段類型、字段長度、字段順序上都完全一樣的,才能進行聯合。

而在分析一段很長的、又使用了union的SQL命令,可以按union分成一條一條SQL命令,然後再去分析每一條SQL命令,看每條命令是什麼表採用什麼鏈接類型進行鏈接,過濾條件是什麼,按什麼進行分組,進行什麼樣的字段彙總函數。只要懂得了SQL命令的工作流程順序,再複雜的SQL命令都可以很快就看明白。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章