在另一個查詢內或運算式中,使用子查詢巢狀處理查詢

有時候您會想要使用查詢結果做為另一個查詢中的欄位,或是做為查詢欄位的準則。例如,假設您希望在每一項產品的訂單之間看見間隔。若要建立顯示此間隔的查詢,您需要將該產品的每一個訂單日期與其他訂單日期做比較。而比較這些訂單日期也需要查詢。您可以使用<token>TE000126768</token>在主查詢內巢狀處理此查詢。

您可以在 <token>TE000126761</token>中使用<token>TE000127167</token>或結構化查詢語言 (SQL) 陳述式編寫子查詢。

本文內容

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm1">將查詢結果作為其他查詢中的欄位</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm2">將子查詢用為查詢欄位的原則</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm3">可搭配子查詢使用的常見 SQL 關鍵字</link>

將查詢結果作為其他查詢中的欄位

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

附註: 用為欄位別名的子查詢無法傳回一個以上的欄位。

您可以使用子查詢欄位別名顯示倚賴目前資料列中其他值的值,這項功能只能使用子查詢執行。

例如,在先前的範例中,您需要瞭解每項產品訂單之間的間隔。在判別此間隔時,您必須比對產品每項訂單的日期。您可以使用 [北風] 資料庫範本建立查詢,以顯示此資訊。

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

  2. 按一下 <ui>[可用範本]</ui> 底下的 <ui>[範例範本]</ui>。

  3. 按一下 <ui>[北風]</ui>,然後按一下 <ui>[建立]</ui>。

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

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

  6. 在 <ui>[顯示資料表]</ui> 對話方塊中,按一下 <ui>[查詢]</ui>,然後按兩下 <ui>[產品訂單]</ui>。

  7. 關閉 <ui>[顯示資料表]</ui> 對話方塊。

  8. 按兩下 <ui>[產品識別碼]</ui> 欄位和 <ui>[訂單日期]</ui> 欄位,將這兩個欄位新增至查詢設計格線。

  9. 在格線內 <ui>[產品識別碼]</ui> 資料行的 <ui>[排序]</ui> 資料列中,選取 <ui>[遞增]</ui>。

  10. 在格線內 <ui>[訂單日期]</ui> 資料行的 <ui>[排序]</ui> 資料列中,選取 <ui>[遞減]</ui>。

  11. 在格線的第三個資料行中,以滑鼠右鍵按一下 <ui>[欄位]</ui> 資料列,然後按一下捷徑功能表上的 <ui>[顯示比例]</ui>。

  12. 在 <ui>[放大顯示]</ui> 對話方塊中,輸入或貼上下列運算式:

    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 關鍵字建立資料表別名的方式,以便比較子查詢中的值與主查詢中目前資料列的值。

  13. 在格線的第四個資料行中,於 <ui>[欄位]</ui> 資料列輸入下列運算式:

    <codeInline>Interval: [Order Date]-[Prior Date]</codeInline>

    此運算式會使用我們利用子查詢所定義出的上一個日期值,計算該產品之每個訂單日期與上一個訂單日期之間的間隔。<br />

  14. 在<ui>設計</ui>索引標籤上的<ui>結果</ui>群組中,按一下 <ui>執行</ui>。

    1. 查詢會執行並顯示一份清單,其中包括產品名稱、訂單日期、前一個訂單日期和訂單日期之間的間隔。結果會先按照 [產品識別碼] 排序 (依遞增順序),再依照 [訂單日期] 排序 (依遞減順序)。

    2. 附註: 由於 [產品識別碼] 預設為查閱欄位,因此 Access 會顯示查閱值 (在此案例中為產品名稱),而不是實際的 [產品識別碼]。雖然這樣會變更出現的值,但是不會變更排序順序。

  15. 關閉 [北風] 資料庫。

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">頁面頂端</link>

將子查詢用為查詢欄位的原則

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

例如,假設您要檢閱由<legacyItalic>非</legacyItalic>業務代表的員工所處理的訂單清單。若要產生此份清單,您需要將每項訂單的員工識別碼與非業務代表之員工的員工識別碼進行比較。若要建立此清單並用以做為欄位準則,您可以使用子查詢,如下列程序中所示:

  1. 開啟北風.accdb 資料庫並啟用其內容。

  2. 關閉登入表單。

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

  4. 在 <ui>[顯示資料表]</ui> 對話方塊的 <ui>[資料表]</ui> 索引標籤上,按兩下 <ui>[訂單]</ui> 和 <ui>[員工]</ui>。

  5. 關閉 <ui>[顯示資料表]</ui> 對話方塊。

  6. 在 [訂單] 資料表中,按兩下 <ui>[員工識別碼]</ui> 欄位、<ui>[訂單識別碼]</ui> 欄位和 <ui>[訂單日期]</ui> 欄位,將這些欄位新增至查詢設計格線。在 [員工] 資料表中,按兩下 <ui>[職稱]</ui> 欄位將它新增至設計格線。

  7. 以滑鼠右鍵按一下 [員工識別碼] 資料行的 <ui>[準則]</ui> 資料列,然後按一下快顯功能表上的 <ui>[顯示比例]</ui>。

  8. 在 <ui>[放大顯示]</ui> 方塊中輸入或貼上下列運算式:

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

    這是子查詢。它會選取所有職稱不是「業務代表」之員工的員工識別碼,然後將該結果集提供給主查詢。主查詢接著會查看 [訂單] 資料表中的員工識別碼是否包含在結果集中。

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

    查詢會執行,而查詢結果會顯示一份由非業務代表員工所處理的訂單清單。

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">頁面頂端</link>

可搭配子查詢使用的常見 SQL 關鍵字

以下為可搭配子查詢使用的幾個 SQL 關鍵字:

附註: 這份清單並不完整。您可以在子查詢中使用任何有效的 SQL 關鍵字,但除了資料定義關鍵字之外。

  • <embeddedLabel>ALL</embeddedLabel> 在 WHERE 子句中使用 ALL,可在比較子查詢所傳回之每一列資料列時,擷取符合條件的資料列。

    例如,假設您要分析大學學生的資料。學生必須維持最低分數,而分數隨主修科目而異。主修科目及其最低分數會儲存在名為 [主修科目] 的資料表中,而相關的學生資訊則儲存在稱為 [學生記錄] 的資料表中。

    若要查看主修科目超過分數之每一位學生的主修科目清單 (及其最低分數),您可以使用下列查詢:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] < ALL
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
  • <embeddedLabel>ANY</embeddedLabel> 在 WHERE 子句中使用 ANY,可在比對子查詢所傳回至少一列的資料列時,擷取符合條件的資料列。

    例如,假設您要分析大學學生的資料。學生必須維持最低分數,而分數隨主修科目而異。主修科目及其最低分數會儲存在名為 [主修科目] 的資料表中,而相關的學生資訊則儲存在稱為 [學生記錄] 的資料表中。

    若要查看主修科目不符合分數之每一位學生的主修科目清單 (及其最低分數),您可以使用下列查詢:

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

    附註: 您也可以使用 SOME 關鍵字達到相同的目的;SOME 關鍵字與 ANY 同義。

  • <embeddedLabel>EXISTS</embeddedLabel> 在 WHERE 子句中使用 EXISTS,可指定子查詢至少須傳回一列資料列。您也可以在 EXISTS 之前加上 NOT,指定子查詢不需傳回任何資料列。

    例如,下列查詢會傳回至少在一個現有訂單中找到之產品的清單:

    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]);
  • <embeddedLabel>IN</embeddedLabel> 在 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');

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">頁面頂端</link>

增進您的 Office 技巧
探索訓練
優先取得新功能
加入 Office 測試人員

這項資訊有幫助嗎?

感謝您的意見反應!

感謝您的意見反應! 我們將協助您與其中一位 Office 支援專員連絡以深入了解您的意見。

×