使用表以外的内容创建查询(Visual Database Tools)

适用于: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 函数