SQL中UNION與UNIONALL的區別

2021-06-16 01:00:52 字數 2564 閱讀 9794

sqlserver2000中

union與

unionall的

區別union運算子:

將兩個或更多查詢的結果組合為單個結果集,該結果集包含聯合查詢中的所有查詢的全部行。這與使用聯接組合兩個表中的列不同。

使用union組合兩個查詢的結果集的兩個基本規則是:

所有查詢中的列數和列的順序必須相同。

資料型別必須相容。

這種多結果的查詢組合為單一結果集在實際中應用的非常方便。但在應用中也有有著問題,如下例項可以進一步說明問題。

問題描述:

為了進一步分析與統計企業中關鍵部件的生產進度情況,採用了乙個表key_item_cal,其結構如圖一:

圖一通過聯合查詢,將查詢分為三個方面:

1、提出資料的基礎明細,其**如下:

selectdbo.key_item.key_item_nameasitem_name,

dbo.h_morve.qty_recvd1asquantity,dbo.key_item.styleasstyle

fromdbo.key_itemleftouterjoin

dbo.h_morveondbo.key_item.key_item=dbo.h_morve.item

where(dbo.key_item.key_item<>1)

orderbystyleasc

其結果為:

2、提出資料的一級彙總明細,其**如下:

selectdbo.key_item.key_item_nameasitem_name,

sum(dbo.h_morve.qty_recvd1)asquantity,max(dbo.key_item.style)asstyle

fromdbo.key_itemleftouterjoin

dbo.h_morveondbo.key_item.key_item=dbo.h_morve.item

where(dbo.key_item.key_item<>1)

groupbydbo.key_item.style,dbo.key_item.key_item_name

orderbystyle

其結果如圖如示:

3、提出資料的二級彙總明細,其**如下:

select max(dbo.key_item.key_item_name)asitem_name,

sum(dbo.h_morve.qty_recvd1)asquantity,

dbo.key_item.styleasstyle

fromdbo.key_itemleftouterjoin

dbo.h_morveondbo.key_item.key_item=dbo.h_morve.item

groupbydbo.key_item.style

orderbydbo.key_item.styleasc

其結果如圖所示:

總體的就如以上所示,但通過

union聯接的時候出現了新的問題。通過以下例子,就可以看出

union與

unionall的

區別方案一,其**如下:

selectdbo.key_item.key_item_nameasitem_name,

dbo.h_morve.qty_recvd1asquantity,dbo.key_item.styleasstyle

fromdbo.key_itemleftouterjoin

dbo.h_morveondbo.key_item.key_item=dbo.h_morve.item

where(dbo.key_item.key_item<>1)

union(

selectdbo.key_item.key_item_nameasitem_name,

sum(dbo.h_morve.qty_recvd1)asquantity,max(dbo.key_item.style)asstyle

fromdbo.key_itemleftouterjoin

dbo.h_morveondbo.key_item.key_item=dbo.h_morve.item

where(dbo.key_item.key_item<>1)

groupbydbo.key_item.style,dbo.key_item.key_item_name

union

selectmax(dbo.key_item.key_item_name)asitem_name,sum(dbo.h_morve.qty_recvd1)asquantity,

dbo.key_item.styleasstyle

fromdbo.key_itemleftouterjoin

dbo.h_morveondbo.key_item.key_item=dbo.h_morve.item

groupbydbo.key_item.style)

orderbydbo.key_item.styleasc

go其結果如下:

問題:通過以上結果,可以發現gr180.14.2.1後機架、py165g.14.2.1b後機架和py165k.14.2.1後機架的明細與其二級彙總值明顯不符。而二級彙總的值是正確,為什麼明細與彙總值不符?1

SQL語句中 UNION與UNION ALL的區別

union用的比較多union all是直接連線,取到得是所有值,記錄可能有重複 union 是取唯一值,記錄沒有重複 1 union 的語法如下 sql 語句 1 union sql 語句 2 2 union all 的語法如下 sql 語句 1 union all sql 語句 2 效率 uni...

SQL語句中 UNION與UNION ALL的區別

union用的比較多 union all是直接連線,取到得是所有值,記錄可能有重複 union 是取唯一值,記錄沒有重複 1 union 的語法如下 sql 語句 1 union sql 語句 2 2 union all 的語法如下 sql 語句 1 union all sql 語句 2 效率 un...

SQL語句中 UNION與UNION ALL的區別

union用的比較多union all是直接連線,取到得是所有值,記錄可能有重複 union 是取唯一值,記錄沒有重複 1 union 的語法如下 sql 語句 1 union sql 語句 2 2 union all 的語法如下 sql 語句 1 union all sql 語句 2 效率 uni...