有時候您可能會想要將查詢結果當做另一個查詢中的欄位,或做為查詢欄位的準則。 例如,假設您要查看每個產品訂單之間的間隔。 若要建立顯示此時間間隔的查詢,您需要比較每個訂單日期與該產品的其他訂單日期。 比較這些訂單日期也需要查詢。 您可以使用函數將這個查詢巢 子查詢。

您可以在表單中撰寫子查詢 運算式 或結構化查詢語言 (SQL) 語句 SQL 檢視。

本文內容

使用查詢結果做為另一個查詢中的欄位

您可以使用子查詢做為欄位別名。 當您想要使用子查詢結果做為主查詢中的欄位時,請使用子查詢做為欄位別名。

附註: 您做為欄位別名使用的子查詢無法返回多個欄位。

您可以使用子查詢欄位別名來顯示相依于目前資料列中其他值的值,這在使用子查詢的情況下是不可能的。

例如,讓我們回到您想要查看每個產品訂單間隔的範例。 若要判斷此間隔,您需要比較每個訂單日期與該產品的其他訂單日期。 您可以使用 Northwind 資料庫範本建立顯示此資訊的查詢。

  1. 按一下 [檔案] 索引標籤上的 [新增]。

  2. [可用的範本>下,按一下 範例範本

  3. 按一下 [北風,然後按一下 [ 建立

  4. 依照 [北風貿易] 頁面上的指示 (在 [啟動畫面] 物件索引籤上) 開啟資料庫,然後關閉 [登入對話方塊] 視窗。

  5. 在 [建立] 索引標籤上,按一下 [查詢] 群組中的 [查詢設計]。

  6. 按一下 [ 查詢> 索引 鍵,然後按兩下 [ 產品訂單

  7. 按兩下 [ 產品識別碼> 欄位和 [ 訂單日期 > 欄位,將它們新增到查詢設計格線。

  8. 在網格 之產品 識別碼 欄的排序列中 ,選取遞增

  9. 格線之訂單日期欄的排序列中,選取遞

  10. 在格線的第三欄中,以滑鼠右鍵按一下[欄位列,然後按一下快捷方式功能表上的縮放。

  11. 在 [ 縮放 功能圖> 對話方塊中,輸入或貼上下列運算式:

    Prior Date: (SELECT MAX([Order Date]) 
    FROM [Product Orders] AS [Old Orders]
    WHERE [Old Orders].[Order Date] < [Product Orders].[Order Date]
    AND [Old Orders].[Product ID] = [Product Orders].[Product ID])

    此運算式是子查詢。 針對每一列,子查詢會選取比已與列關聯的訂單日期較新的最近訂單日期。 請注意如何使用 AS 關鍵字建立資料表別名,以便比較子查詢中的值與主查詢目前資料列的值。

  12. 在格線的第四欄的 欄位列中, 輸入下列運算式:

    Interval: [Order Date]-[Prior Date]

    此運算式會使用使用子查詢所定義的先前日期值,計算該產品每一個訂單日期與先前訂單日期之間的間隔。

  13. 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。

    1. 查詢會執行並顯示產品名稱、訂單日期、先前的訂單日期,以及訂單日期之間的間隔清單。 結果會先按照產品識別碼 (以遞增順序) ,然後按訂單日期 (以遞減順序排序) 。

    2. 附註: 由於產品識別碼是一個查找欄位,因此根據預設,Access 會顯示 (在此案例中,產品名稱會顯示) ,而不是實際的產品識別碼。 雖然這會變更顯示的值,但不會變更排序次序。

  14. 關閉 Northwind 資料庫。

頁面頂端

使用子查詢做為查詢欄位的準則

您可以使用子查詢做為欄位準則。 當您想要使用子查詢的結果來限制欄位顯示的值時,請使用子查詢做為欄位準則。

例如,假設您要檢查非銷售代表的員工所 處理的訂單清單 。 若要產生這份清單,您需要比較每一份訂單的員工識別碼,以及非銷售代表的員工員工識別碼清單。 若要建立此清單並做為欄位準則,您可以使用子查詢,如下列程式所示:

  1. 開啟 Northwind.accdb 並啟用其內容。

  2. 關閉登入表單。

  3. [建立] 索引標籤的 [其他] 群組中,按一下 [查詢設計]

  4. 在 [ 資料表> 索引 鍵上,按兩下 [訂單員工

  5. 在 [訂單資料表中,按兩下員工 識別碼 欄位、訂單 識別碼 欄位和訂單 日期 欄位,以將它們新增到查詢設計格線。 在 [員工> 資料表中,按兩下 [職 稱> 欄位,將其新增到設計格線線。

  6. 以滑鼠 按右鍵 員工識別碼欄的 [準則列,然後按一下 快捷方式功能表 上的縮放。

  7. 在縮放 方塊 中,輸入或貼上下列運算式:

    IN (SELECT [ID] FROM [Employees] 
    WHERE [Job Title]<>'Sales Representative')

    這是子查詢。 它會選取員工沒有銷售代表職稱的所有員工資訊,並且將結果設定為主查詢。 然後主查詢會檢查來自 Orders 資料表的員工資料是否位在結果集。

  8. 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。

    查詢會執行,而查詢結果會顯示非銷售代表的員工所處理的訂單清單。

頁面頂端

可用於子查詢的常見 SQL 關鍵字

有幾個 SQL 關鍵字可用於子查詢:

附註: 這份清單並非詳盡無盡。 您可以在子查詢中使用任何有效的 SQL 關鍵字,不含資料定義關鍵字。

  • 所有    在 WHERE 子句中 ALL 可比對子查詢所返回的每一列,來取回符合條件的資料列。

    例如,假設您正在分析大學的學生資料。 學生必須維持最低 GPA,因主修課程而異。 主修專業及其最低 GBA 會儲存在名為主修科的資料表中,而相關的學生資訊會儲存在名為 Student_Records 的資料表中。

    若要查看主修 (及其最低 GPA 清單) 該專業的學生是否超過最低 GPA,您可以使用下列查詢:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] < ALL
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
  • 任何    在 WHERE 子句中,使用 ANY 來比對至少一個子查詢所返回的資料列,來取回符合條件的資料列。

    例如,假設您正在分析大學的學生資料。 學生必須維持最低 GPA,因主修課程而異。 主修專業及其最低 GBA 會儲存在名為主修科的資料表中,而相關的學生資訊會儲存在名為 Student_Records 的資料表中。

    若要查看主修 (及其最低 GPA) 該專業的學生不符合最低 GPA 的清單,您可以使用下列查詢:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

    附註: 您也可以將 SOME 關鍵字用於相同的用途;SOME 關鍵字等同于 ANY。

  • EXISTS     在 WHERE 子句中使用 EXISTS 來表示子查詢應至少會返回一列。 您也可以在使用 NOT 的 EXISTS 前行,表示子查詢不應返回任何資料列。

    例如,下列查詢會以至少一個現有訂單來返回產品清單:

    SELECT *
    FROM [Products]
    WHERE EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);

    使用 NOT EXISTS 時,查詢會返回至少一個現有訂單中找不到的產品清單:

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
  • IN    在 WHERE 子句中使用 IN,確認主查詢目前資料列的值是子查詢所返回集的一部分。 您也可以在 IN 與 NOT 中預先顯示,以確認主查詢目前資料列的值不是子查詢所返回集合的一部分。

    例如,下列查詢會 (訂單日期) 非銷售代表處理的訂單清單:

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]<>'Sales Representative');

    您可以使用 NOT IN,以以下方式撰寫相同的查詢:

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] NOT IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]='Sales Representative');

頁面頂端

Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Insiders

Was this information helpful?

How satisfied are you with the translation quality?
What affected your experience?

Thank you for your feedback!

×