适用于: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”是您要检索其组织的那位经理的员工编号。 有关将用户定义的函数添加到查询的详细信息,请参阅 向查询添加表(Visual Database Tools)。 有关用户定义的函数的完整说明,请参阅 User-Defined 函数。