HOW TO:使用資料表以外的項目建立查詢
當您編寫擷取查詢時,應該明白指出您要的資料行、您要的資料列和查詢處理器尋找原始資料的位置。通常原始資料是某資料表或由聯結在一起的數個資料表組成。但原始資料可能來自資料表以外的來源。其實,原始資料可以來自檢視表、查詢、同義資料表或會傳回資料表的使用者定義函式。
使用檢視表取代資料表
您可以選取檢視表的資料列。例如,假設資料庫中含有名為 "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
如需加入檢視表至查詢的詳細資訊,請參閱 HOW TO:將資料表加入至查詢。
使用查詢取代資料表
您可以選取查詢中的資料列。例如,假設您已編寫某查詢來擷取合著書籍 (具有一位以上作者的書籍) 的書名和識別項。產生的 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") 來稱呼現有查詢。如需別名的詳細資訊,請參閱 HOW TO:建立資料表別名和 HOW TO:建立資料行別名:
同樣的,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
)
如需加入查詢至查詢的資訊,請參閱 HOW TO:將資料表加入至查詢。
使用使用者定義函式取代資料表
在 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。如需加入使用者定義函式至查詢的詳細資訊,請參閱 HOW TO:在查詢中包含使用者定義函式和 HOW TO:將資料表加入至查詢。如需使用者定義函式的完整說明,請參閱 SQL Server 文件。