適用於: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) AS 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)。
使用使用者定義的函式取代數據表
您可以建立傳回資料表的使用者定義函數。 這類函式適用於執行複雜或程式性邏輯。
例如,假設員工資料表包含一個額外的數據行, 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)。 如需使用者定義函數的完整描述,請參閱 使用者定義函數。