適用於: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。