FROM 子句 (SQL Server Compact)

指定要從中擷取資料列的資料表。在 SQL Server Compact 中,FROM 子句是選擇性的。

注意

SQL Server Compact 不支援資料表值函式。

語法

  [ FROM { < table_source > } [ ,...n ]  
< table_source > ::= 
      table_name [ [ AS ] table_alias ] 
   | < joined_table > 
| <derived_table> [ [ AS ] table_alias ]
< joined_table > ::= 
   < table_source > < join_type > < table_source > ON < search_condition > 
| <table_source> CROSS JOIN <table_source>
| <left_table_source> { CROSS | OUTER } APPLY <right_table_source>
   | ( < joined_table > )
< join_type > ::= 
   [ INNER | { { LEFT | RIGHT } [ OUTER ] } ] JOIN ]
left_table_source::= table_source
right_table_source::=table_source

引數

  • < table_source>
    指定 SELECT 陳述式的資料表和聯結資料表。

  • table_name [ [ AS ] table_alias]
    指定資料表名稱,以及選用的別名。

    使用衍生的資料表、資料列集或資料表值函式,子句結尾所需的 table_alias 為所傳回之所有資料行 (包括群組資料行) 的替代資料表名稱。

  • < joined_table >
    本身為兩個或更多資料表之聯結的結果集。

    如果有多個聯結,您可以使用括號指定這些聯結的順序。

  • derived_table
    會從資料庫擷取資料列的子查詢。derived_table 是用於當做外部查詢的輸入。

  • < join_type >
    指定聯結運算的類型。

  • left_table_source { CROSS | OUTER } APPLY right_table_source
    指定 APPLY 運算子的 right_table_source 會針對 left_table_source 的每個資料列進行評估。當 right_table_source 相依於 left_table_source 的值,而且沒有簡單的方式可以表示使用聯結操作的查詢時,這個功能相當實用。

    必須搭配 APPLY 來指定 CROSS 或 OUTER。當指定 CROSS,而且 right_table_source 針對 left_table_source 之指定的資料列進行評估時,不會產生任何資料列,而且會傳回空的結果集。

    當指定 OUTER 時,會針對 left_table_source 的每個資料列產生一個資料列,即使 right_table_source 根據該資料列評估,並傳回空結果集時也一樣。

  • left_table_source
    在上一個引數中定義的資料表來源。如需詳細資訊,請參閱本文結尾的<備註>一節。

  • right_table_source
    在上一個引數中定義的資料表來源。如需詳細資訊,請參閱本文結尾的<備註>一節。

  • CROSS JOIN
    指定兩個資料表的交叉乘積。

  • INNER
    指定傳回所有相符的配對。捨棄兩個資料表中不相符的資料列。如果沒有指定聯結類型,這就是預設值。

  • LEFT [ OUTER ]
    指定除了內部聯結傳回的所有資料列以外,結果集也會包含左側資料表中與指定條件不符的所有資料列。左側資料表中的輸出資料行設定為 NULL。

  • RIGHT [ OUTER ]
    指定除了內部聯結傳回的所有資料列以外,結果集也會包含右側資料表中與指定條件不符的所有資料列。右側資料表中的輸出資料行設定為 NULL。

  • JOIN
    指出應該聯結指定的資料表。

  • ON < search_condition >
    指定聯結的依據條件。此條件可以指定任何有效的述詞,不過通常都會使用資料行和比較運算子。

備註

相同的查詢可以使用 JOIN 或 APPLY 撰寫時,請使用 JOIN,因為這樣比較快。

如果在 right_table_source 中,有任何資料表參考未繫結到 right_table_source 中所出現的任何資料表,則該資料表參考應該 (i) 符合 left_table_source 所公開的資料表名稱或資料表別名,或 (ii) 符合外部 FROM 子句所公開的資料表名稱或別名 (如果 APPLY 出現在 WHERE 子句或 SELECT 清單的子查詢中)。如果在 i 和 ii 中都有相符的參考,則以 i 為優先。

APPLY 運算子和 JOIN 運算子的優先順序相同。如果沒有括號,將會由左至右評估一連串的 JOIN 和 APPLY 運算子。

如需詳細資訊,請參閱《SQL Server 線上叢書》主題:<使用 FROM 子句>和<使用 APPLY>。

範例

下列範例會提供有關使用 FROM 子句的詳細資訊。

SELECT [Order ID], [Unit Price]
FROM [Order Details]

使用簡易 FROM 子句

下列範例會從 Northwind 範例資料庫的 Employees 資料表中擷取 Employee ID 和 Last Name 資料行。

SELECT [Employee Id], [Last Name]
FROM Employees
ORDER BY [Employee Id]

使用 CROSS JOIN

下列範例會傳回 Employees 和 Orders 這兩份資料表的交叉乘積。系統會傳回 Employee ID 資料列和 Order ID 資料列之所有可能組合的清單。

SELECT E.[Employee ID], O.[Order Id]
FROM Employees E
CROSS JOIN Orders O
ORDER BY E.[Employee ID], O.[Order Id];

使用 LEFT OUTER JOIN

下列範例會針對 Product ID 聯結兩份資料表並保留左側資料表中不相符的資料列。系統會針對每份資料表中的 Product ID 資料行,比對 Products 資料表與 Order Details 資料表。所有產品 (已排序和未排序) 都會顯示在結果集中。

SELECT p.[Product Name], od.[Order ID]
FROM Products p
LEFT OUTER JOIN [Order Details] od
ON p.[Product ID] = od.[Product ID]
ORDER BY p.[Product Name];

下面是結果集:

        Product Name            Order ID
        --------------------------------
        Alice Mutton               10000
        Alice Mutton               10045
        Alice Mutton               10093
        Alice Mutton               10124
        Alice Mutton               10166
(2820 rows affected)

使用 INNER JOIN

下列範例會傳回所有產品名稱和銷售訂單識別碼。

-- By default, SQL Server Compact performs an INNER JOIN if only  
-- the JOIN keyword is specified.
SELECT p.[Product Name], od.[Order ID]
FROM Products p
INNER JOIN [Order Details] od
ON p.[Product ID] = od.[Product ID]
ORDER BY p.[Product Name];

使用 RIGHT OUTER JOIN

下列範例會針對 Product ID 聯結兩份資料表並保留右側資料表中不相符的資料列。系統會針對每份資料表中的 Product ID 資料行,比對 Products 資料表與 Order Details 資料表。所有產品 (已排序和未排序) 都會顯示在結果集中。

SELECT p.[Product Name], od.[Order ID]
FROM Products p
RIGHT OUTER JOIN [Order Details] od
ON p.[Product ID] = od.[Product ID]
ORDER BY p.[Product Name];

使用衍生資料表

下列範例會使用衍生資料表 (FROM 子句之後的 SELECT 陳述式) 來傳回所有員工的名字和姓氏,以及與他們進行交易之客戶的連絡人姓名和所在城市。

SELECT RTRIM(e.[First Name]) + ' ' + LTRIM(e.[Last Name]) AS [Employee Name], C.[Contact Name], C.City
FROM Employees e
INNER JOIN Orders O 
ON O.[Employee ID] = e.[Employee ID]
INNER JOIN (SELECT [Contact Name], City, [Customer Id] 
FROM Customers) AS C
ON O.[Customer Id] = C.[Customer Id]
ORDER BY e.[Last Name], e.[First Name];

使用 APPLY

CROSS APPLY 會將來源資料指定為資料表結果的值,而非資料表名稱。CROSS APPLY 可用於針對外部查詢內的每一個資料列立即產生資料子集的案例。CROSS APPLY 可讓使用者根據外部查詢中的資料列來指定建構子集的方式。下列是一個查詢範例,其中會針對使用 CROSS APPLY 的每一個資料列來執行作業。

範例:

SELECT
FROM
  Orders AS O CROSS APPLY
  (
    SELECT TOP(2) * --for each row in Orders there will be at most 2 customers
    FROM Customers C
    WHERE C.[Customer ID] = O.[Customer ID]
    ORDER BY C.[Customer ID]
  ) AS theOrdersTopCustomers

OUTER APPLY 會將來源資料指定為資料表結果的值,而非資料表名稱。OUTER APPLY 可用於針對外部查詢內的每一個資料列立即產生資料子集的案例。與 CROSS APPLY 不同的是,OUTER APPLY 也會保留外部查詢中與內部查詢完全不相符的資料列。以下範例示範一個查詢,此查詢也包含無任何相符項目的結果。

範例:

SELECT
FROM
  Customers AS C OUTER APPLY
  (
    SELECT TOP(1) *
    FROM Orders O
    WHERE O.[Customer ID] = C.[Customer ID]
    ORDER BY O.[Customer ID]
  ) AS topCustomerID

上述範例中顯示 OUTER APPLY 結果包含 Customer ID 'PARIS',因為 Orders 資料表未包含 'PARIS' 的任何記錄。因此,內部查詢傳回 NULL 當做在 Orders 資料表中符合 'PARIS' 的 TOP Customer ID。以 CROSS 替換 OUTER 會從結果中排除 'PARIS'。

注意

在 SQL Server Compact 中,APPLY 不支援使用者定義函數。