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 te***
在每節sql命令,都加了乙個字段,它的值都是零(沒有嘛,當然是零啦)。這樣一樣,每節sql命令生成的表在結構上就完全一樣了,就可以使用union了。大家試一下,如果都不加個字段的話,那雖然不會出錯,但結果的結構就跟要求不一樣了。
在上面那條命令,每一節都可以使用"as"來給字段重新起名。如果在第一節使用了"as",則以後的則可能不用了。否則的話,就是最後使用"as"的那節才起作用,前面的都無效了。
te***出來了,就可以使用分級合併了。
sele cpbh,sum(thsl) as thsl,sum(jhsl) as jhsl ;
from te*** ;
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命令都可以很快就看明白。
UNION 查詢中的排序
mssql 不允許在union查詢中使用 order by 因此,當我們需要這種功能的時候,就需要繞一些彎路.比如有一張學生表student 和教師表 teacher 我們要查詢所有的教師學生的姓名和年齡,教師排前面,學生排後面,分別按字母順序,則可能會想寫乙個這樣的sql語句 注意,這個語句只是為...
聯表查詢 union的使用
直接show sql mysql select from std id sid class 1 11 1 2 21 1 3 13 2 4 14 3 5 51 2 6 16 2 7 17 1 mysql select from stdn id sid name 1 222 11 2 111 22 3 ...
MySQL中Union聯合查詢使用實踐總結
聯合查詢 將多次查詢 多條select語句 在記錄上進行拼接 一般記錄數增加,但是字段數不會增加 這裡需要注意的是,多條select 語句字段數必須一致,字段型別可以不同!語法格式 select 1.union union 選項 select 2.union選項 與select選項一樣,有兩個對記錄...