union

學習SQLSERVER的資料:http://www.fzs8.net/database/2007-07-03/7601.html

 

與其它 Transact-SQL 語句一起使用 UNION 語句

與其它 Transact-SQL 語句一起使用 UNION 語句時,請遵循以下指南:

  • UNION 語句中的第一個查詢可以包含一個 INTO 子句,該子句用來創建容納最終結果集的表。只有第一個查詢可以使用 INTO 子句。如果該子句出現在別處,Microsoft® SQL Server™ 2000 將顯示錯誤信息。此外請記住:如果沒有設置 select into/bulkcopy 選項,那麼 SELECT INTO 子句只能創建臨時表。
  • 只有在 UNION 語句的結尾,才允許使用 ORDER BY 和 COMPUTE 子句以定義最終結果的順序或計算彙總值。不能在組建 UNION 語句的單獨查詢中使用這些子句。
  • GROUP BY 和 HAVING 子句只能在單獨的查詢中使用;它們不能用來影響最終的結果集。
  • UNION 運算符可用於 INSERT 語句中。
  • FOR BROWSE 子句不能在包含 UNION 運算符的語句中使用。

UNION 運算符使用準則

使用 UNION 運算符時請遵循以下準則:

  • 在使用 UNION 運算符組合的語句中,所有選擇列表的表達式數目必須相同(列名、算術表達式、聚合函數等)。
  • 在使用 UNION 組合的結果集中的相應列、或個別查詢中使用的任意列的子集必須具有相同數據類型,並且兩種數據類型之間必須存在可能的隱性數據轉換,或提供了顯式轉換。例如,在 datetime 數據類型的列和 binary 數據類型的列之間不可能存在 UNION 運算符,除非提供了顯式轉換,而在 money 數據類型的列和 int 數據類型的列之間可以存在 UNION 運算符,因爲它們可以進行隱性轉換。
  • 用 UNION 運算符組合的各語句中對應的結果集列出現的順序必須相同,因爲 UNION 運算符是按照各個查詢給定的順序逐個比較各列。

    示例如下:

    table3     table4  
    a b -c a b
    int char(4) char(4) char(4) float
    --- ------- ------- ------- -------
    1 abc jkl jkl 1.000
    2 def mno mno 5.000
    3 ghi pqr    

    
    

    執行以下查詢:

    SELECT a, b FROM table3UNION SELECT b, a FROM table4

    下面是結果集:

    a          b--------   -----1.000000   abc2.000000   def3.000000   ghi1.000000   jkl5.000000   mno

    在 UNION 操作中組合不同的數據類型時,這些數據類型將使用數據類型優先級的規則進行轉換。在前面的示例中,int 值轉換成 float 值,因爲 float 類型的優先權比 int 類型高。有關更多信息,請參見數據類型的優先順序。

    以下查詢將產生錯誤信息,因爲相應列的數據類型不兼容:

    SELECT b, c FROM table3UNION SELECT a, b FROM table4
  • 通過 UNION 生成的表中的列名來自 UNION 語句中的第一個單獨的查詢。若要用新名稱引用結果集中的某列(例如在 ORDER BY 子句中),必須按第一個 SELECT 語句中的方式引用該列:
    SELECT city AS Cities FROM stores_westUNION SELECT city FROM stores_eastORDER BY city
使用 UNION 運算符組合多個結果

UNION 運算符使您得以將兩個或多個 SELECT 語句的結果組合成一個結果集。使用 UNION 組合的結果集都必須具有相同的結構。而且它們的列數必須相同,並且相應的結果集列的數據類型必須兼容。有關更多信息,請參見 UNION 運算符使用指南。

UNION 的指定方式如下:

select_statement UNION [ALL] select_statement

例如,Table1Table2 具有相同的兩列結構。

Table1  Table2 
ColumnAColumnB ColumnCColumnD
char(4)int char(4)int
---------- ----------
abc1 ghi3
def2 jkl4
ghi3 mno5

下面的查詢在這兩個表之間創建 UNION 運算:

SELECT * FROM Table1UNIONSELECT * FROM Table2

下面是結果集:

ColumnA  ColumnB-------  --------abc      1def      2ghi      3jkl      4mno      5

UNION 的結果集列名與 UNION 運算符中第一個 SELECT 語句的結果集中的列名相同。另一個 SELECT 語句的結果集列名將被忽略。

默認情況下,UNION 運算符從結果集中刪除重複的行。如果使用 ALL 關鍵字,那麼結果中將包含所有行並且將不刪除重複的行。

UNION 運算的準確結果取決於安裝過程中選擇的排序規則和 ORDER BY 子句。有關不同排序規則的效果的更多信息,請參見 SQL Server 排序規則基礎知識。

Transact-SQL 語句中可以出現任意數目的 UNION 運算符,例如:

SELECT * FROM TableAUNIONSELECT * FROM TableBUNIONSELECT * FROM TableCUNIONSELECT * FROM TableD

默認情況下,Microsoft® SQL Server™ 2000 從左到右對包含 UNION 運算符的語句進行取值。使用圓括號指定求值的順序。例如,以下語句並不等價:

/* First statement. */SELECT * FROM TableAUNION ALL(   SELECT * FROM TableB   UNION   SELECT * FROM TableC)GO/* Second statement. */(SELECT * FROM TableA UNION ALL SELECT * FROM TableB)UNIONSELECT * FROM TableC)GO

在第一個語句中,將消除 TableBTableC 之間的聯合中的重複行。而在該集與 TableA 之間的並集中,不消除重複行。在第二個語句中,TableATableB 之間的聯合中包含重複行,但在隨後與 TableC 的聯合中將消除。ALL 關鍵字對此表達式的最終結果沒有影響。

如果使用 UNION 運算符,那麼單獨的 SELECT 語句不能包含其自己的 ORDER BY 或 COMPUTE 子句。只能在最後一個 SELECT 語句的後面使用一個 ORDER BY 或 COMPUTE 子句;該子句適用於最終的組合結果集。GROUP BY 和 HAVING 子句只能在單獨的 SELECT 語句中指定。

 

在ORACLE中:

--語法正確,並且排序也正確。

select * from (select * from emp where deptno=30 order by empno desc)
union all
select * from (select * from emp where deptno=30 order by empno)

--語法錯誤

select * from emp where deptno=30
union all
select * from emp where deptno=30 order by empno

 

在SQLSERVER2000中:

--語法正確,但是排序不正確

select * from (select * from emp where deptno=30 order by empno desc) a
union all
select * from (select * from emp where deptno=30 order by empno) b

--語法正確

select * from emp where deptno=30

union all
select * from emp where deptno=30 order by empno

--錯誤

select * from (select * from emp where deptno=30 order by empno desc)
union all
select * from (select * from emp where deptno=30 order by empno)

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