複雜查詢中 union的使用

2021-04-06 21:16:04 字數 2085 閱讀 3453

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選項一樣,有兩個對記錄...