如何:使用資料表以外的項目建立查詢

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

使用檢視表取代資料表

您可以選取檢視表的資料列。 例如,假設資料庫中含有名為 "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

如需加入檢視表至查詢的詳細資訊,請參閱 如何:將資料表加入至查詢

使用查詢取代資料表

您可以選取查詢中的資料列。 例如,假設您已編寫某查詢來擷取合著書籍 (具有一位以上作者的書籍) 的書名和識別項。 產生的 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") 來稱呼現有查詢。 如需別名的詳細資訊,請參閱 如何:建立資料表別名如何:建立資料行別名

同樣的,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
        )

如需加入查詢至查詢的資訊,請參閱 如何:將資料表加入至查詢

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

在 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。 如需加入使用者定義函式至查詢的詳細資訊,請參閱 如何:在查詢中包含使用者定義函式如何:將資料表加入至查詢。 如需使用者定義函式的完整說明,請參閱 SQL Server 文件。

請參閱

其他資源

使用預存程序和使用者定義函式