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

當您編寫擷取查詢時,應該明白指出您要的資料行、您要的資料列和查詢處理器尋找原始資料的位置。 通常其原始資料是由某資料表組成或由數個資料表聯結在一起。 但原始資料可能源自資料表以外的來源。 其實,原始資料可以來自檢視、查詢、同義資料表或傳回資料表的使用者定義函數。

使用檢視取代資料表

您可以選取檢視的資料列。 例如,假設資料庫中含有名為「ExpensiveBooks」的檢視,其中每個資料列將說明價錢超過 19.99 的書名。 其檢視定義將如下所示:

SELECT *
FROM titles
WHERE price > 19.99

只要選取 [ExpensiveBooks] 檢視中的心理書籍,您就可以選取昂貴的心理書籍。 產生的 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)>。

使用使用者定義函數取代資料表

在 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)>。 如需使用者自訂函數的完整描述,請參閱<使用者定義函數>。