如何使用表以外的对象创建查询 (Visual Database Tools)

每次编写检索查询时,必须明确说明所需的列和行以及查询处理器应从何处查找原始数据。一般情况下,此类原始数据由一个表或几个联接在一起的表组成。不过,原始数据也可以来自表以外的源。事实上,它可以来自视图、查询、同义词或可返回表的用户定义函数。

使用视图代替表

您可以从视图选择行。例如,假设数据库包含一个名为“ExpensiveBooks”的视图,在该视图中,每行描述一个价格超过 19.99 美元的书名。视图定义可能类似以下形式:

SELECT *
FROM titles
WHERE price > 19.99

这样,只需从 ExpensiveBooks 视图中选择心理学书籍,就可以选择较贵的心理学书籍。生成的 SQL 结果可能类似以下形式:

SELECT *
FROM ExpensiveBooks
WHERE type = 'psychology'

同样,视图也可以参与 JOIN 操作。例如,只需将 sales 表联接到 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)

使用用户定义函数代替表

在 SQL Server 2000 或更高版本中,可以创建返回表的用户定义函数。此类函数对执行复杂逻辑操作或逐步逻辑操作很有用。

例如,假设 employee 表包含一个附加列 employee.manager_emp_id,且存在从 manager_emp_id 到 employee.emp_id 的外键。在 employee 表的每一行内,manager_emp_id 列都显示相应雇员的老板。更确切地说,它显示该雇员的老板的 emp_id。您可以创建用户定义函数以返回这样的表:在某个特定高级经理的所辖部门层次结构中工作的每个雇员在该表中各占一行。您可以调用函数 fn_GetWholeTeam,并对其进行设计以获得输入变量(待检索部门的经理的 emp_id)。

随后可以编写将 fn_GetWholeTeam 函数用作数据源的查询。生成的 SQL 结果可能类似以下形式:

SELECT * 
FROM 
     fn_GetWholeTeam ('VPA30890F')

“VPA30890F”是待检索部门的经理的 emp_id。有关向查询添加用户定义函数的详细信息,请参阅如何向查询中添加表 (Visual Database Tools)。有关用户定义函数的完整说明,请参阅用户定义函数(数据库引擎)