适用于: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)。 有关用户定义函数的完整说明,请参阅 用户定义的函数。