共用方式為


使用資料表以外的其他項目建立查詢(Visual Database Tools)

適用於:SQL Server

每當您撰寫擷取查詢時,您就會清楚說明您想要的數據行、您想要的數據列,以及查詢處理器應該在哪裡找到原始數據。 一般而言,此原始數據是由一個數據表或數個聯結在一起的數據表所組成。 但原始數據可能來自數據表以外的來源。 事實上,它可以來自傳回數據表的視圖、查詢、同義詞或使用者定義函式。

使用視圖取代資料表

您可以從檢視中選取資料列。 例如,假設資料庫包含名為 「ExpensiveBooks」 的檢視,其中每個數據列都會描述價格超過 19.99 的標題。 檢視定義可能如下所示:

SELECT *  
FROM titles  
WHERE price > 19.99  

您只要從 [昂貴書籍] 檢視中選取心理學書籍,即可選取昂貴的心理學書籍。 產生的 SQL 看起來可能像這樣:

SELECT *  
FROM ExpensiveBooks  
WHERE type = 'psychology'  

同樣地,檢視可以參與 JOIN(聯結)作業。 例如,只要將銷售數據表聯結至 ExpensiveBooks 檢視,即可找到昂貴的書籍銷售量。 產生的 SQL 看起來可能像這樣:

SELECT *  
FROM sales   
         INNER JOIN   
         ExpensiveBooks   
         ON sales.title_id   
         =  ExpensiveBooks.title_id  

如需將檢視新增至查詢的詳細資訊,請參閱 將數據表新增至查詢 (Visual Database Tools)

用查詢取代表格

您可以從查詢中選取資料列。 例如,假設您已經撰寫查詢來擷取共同撰寫書籍的標題和標識碼,也就是具有多個作者的書籍。 SQL 看起來可能像這樣:

SELECT   
     titles.title_id, title, type  
FROM   
     titleauthor   
         INNER JOIN  
         titles   
         ON titleauthor.title_id   
         =  titles.title_id   
GROUP BY   
     titles.title_id, title, type  
HAVING COUNT(*) > 1  

然後,您可以基於此結果撰寫另一個查詢。 例如,您可以撰寫查詢來擷取由多人共同撰寫的心理學書籍。 若要撰寫這個新的查詢,您可以使用現有的查詢作為新查詢數據的來源。 產生的 SQL 看起來可能像這樣:

SELECT   
    title  
FROM   
    (  
    SELECT   
        titles.title_id,   
        title,   
        type  
    FROM   
        titleauthor   
            INNER JOIN  
            titles   
            ON titleauthor.title_id   
            =  titles.title_id   
    GROUP BY   
        titles.title_id,   
        title,   
        type  
    HAVING COUNT(*) > 1  
    )   
    co_authored_books  
WHERE     type = 'psychology'  

強調的文字會顯示做為新查詢數據來源的現有查詢。 請注意,新查詢會針對現有的查詢使用別名 (“co_authored_books”。 如需別名的詳細資訊,請參閱 建立數據表別名 (Visual Database Tools)建立數據行別名 (Visual Database Tools)

同樣地,查詢可以參與 JOIN 作業。 例如,您只需將 ExpensiveBooks 檢視與用於擷取共同撰寫書籍的查詢進行聯結,即可找到昂貴的共同撰寫書籍的銷售情況。 產生的 SQL 看起來可能像這樣:

SELECT   
    ExpensiveBooks.title  
FROM   
    ExpensiveBooks   
        INNER JOIN  
        (  
        SELECT   
            titles.title_id,   
            title,   
            type  
        FROM   
            titleauthor   
                INNER JOIN  
                titles   
                ON titleauthor.title_id   
                =  titles.title_id   
        GROUP BY   
            titles.title_id,   
            title,   
            type  
        HAVING COUNT(*) > 1  
        )  

如需有關合併查詢的詳細資訊,請參閱 將數據表新增至查詢(Visual Database Tools)

使用 User-Defined 函式來替代數據表

在 SQL Server 2000 或更高版本中,您可以建立可傳回數據表的使用者定義函式。 這類函式適用於執行複雜或程式性邏輯。

例如,假設員工資料表包含一個額外的欄位employee.manager_emp_id,並且從manager_emp_id到employee.emp_id存在一個外鍵。 在員工數據表的每個數據列中,manager_emp_id數據行會指出員工的老闆。 更確切地說,這表示員工的老闆的員工編號 (emp_id)。 您可以建立一個使用者定義函式,傳回一個數據表,其中的每一行代表在特定高層經理的組織架構內工作的每位員工。 您可以呼叫函式fn_GetWholeTeam,並設計它以接受輸入變數——要擷取其團隊的經理的emp_id。

您可以撰寫使用 fn_GetWholeTeam 函式做為數據源的查詢。 產生的 SQL 看起來可能像這樣:

SELECT *   
FROM   
     fn_GetWholeTeam ('VPA30890F')  

“VPA30890F” 是您要擷取其組織之經理的emp_id。 如需將使用者定義函式新增至查詢的詳細資訊,請參閱 將數據表新增至查詢 (Visual Database Tools)。 如需使用者定義函式的完整描述,請參閱 User-Defined Functions