Transact-SQL 参考

FROM

指定在 DELETE、SELECT 和 UPDATE 语句中使用的表、视图、派生表和连接表。

语法

[ FROM { < table_source > } [ ,...n ] ]

< table_source > ::=
    table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
    | view_name [ [ AS ] table_alias ] [ WITH ( < view_hint > [ ,...n ] ) ]
    | rowset_function [ [ AS ] table_alias ]
    | user_defined_function [ [ AS ] table_alias ]
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
    | < joined_table >

< joined_table > ::=
    < table_source > < join_type > < table_source > ON < search_condition >
    | < table_source > CROSS JOIN < table_source >
    | [ ( ] < joined_table > [ ) ]

< join_type > ::=
    [ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
    [ < join_hint > ]
    JOIN

参数

< table_source >

指定要在 Transact-SQL 语句中使用的表或视图(带或不带别名均可)。可在语句中使用多达 256 个表。可将 table 变量指定为表源。

如果表或视图存在于同一台运行 Microsoft® SQL Server™ 的计算机的其它数据库中,应按格式 database.owner.object_name 使用完全合法的名称。如果表或视图存在于本地服务器之外的一台链接的服务器上,应按以下格式使用由四部分组成的名称:linked_server.catalog.schema.object。如果由四部分构造的表(或视图)名称使用 OPENDATASOURCE 函数作为名称中的服务器部分,则该名称也可用于指定表源。有关该函数的更多信息,请参见 OPENDATASOURCE

table_name

表名。FROM 关键字之后的表和视图的顺序并不影响返回的结果集。当 FROM 子句中出现重复名称时将报告错误。

[AS] table_alias

table_nameview_name rowset_function 的别名,为方便起见而使用,或用于区分自联接或子查询中的表或视图。别名通常是一个缩短了的表名,用于在联接中引用表中的特定列。如果联接中的多个表中有相同名称的列存在,SQL Server 要求必须使用表名或别名来限定列名。(如果定义了别名则不能使用表名)。

WITH ( < table_hint > )

指定表扫描、查询优化器要使用的一个或多个索引或查询优化器要对此表、此语句使用的锁定方法。有关更多信息,请参见"表提示"。

view_name

是视图名称。视图是一个"虚拟表",通常创建为一个或多个表中列的子集。

WITH ( < view_hint > )

指定索引视图扫描。默认情况下,视图在查询优化器处理查询之前展开。视图提示只能用在 SELECT 语句中,而不能用于 UPDATE、DELETE 或 INSERT 语句。

rowset_function

指定一个行集函数,该函数返回可替代表引用的对象。有关行集函数列表的更多信息,请参见行集函数

user_defined_function

指定用户定义的函数,该函数返回一个表。如果用户定义的函数是一个内置的用户定义函数,则前面必须加两个冒号,如:

FROM ::fn_listextendedproperty

derived_table

是从数据库中检索行的子查询。derived_table 用作对外部查询的输入。

column_alias

替换结果集内列名的可选别名。在选择列表中放入每个列的一个别名,并将整个列别名列表用圆括号括起来。

<joined_table>

由两个或更多表的积组成的结果集,例如:

SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
    RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
        ON tab3.c1 = tab4.c1
        ON tab2.c3 = tab4.c3

对于多个 CROSS 联接,请使用圆括号来更改联接的自然顺序。

<join_type>

指定联接操作的类型。

INNER

指定返回每对匹配的行。废弃两个表中不匹配的行。如果未指定联接类型,则这是默认设置。

FULL [OUTER]

指定在结果集中包含左表或右表中不满足联接条件的行,并将对应于另一个表的输出列设为 NULL。这是对通常由 INNER JOIN 返回的所有行的补充。

说明  按此处指定的方法指定外联接或在 WHERE 子句中使用旧式非标准的 *= 和 =* 运算符都是可行的。不能在同一语句中同时使用这两种方法。

LEFT [OUTER]

指定在结果集中包含左表中所有不满足联接条件的行,且在由内联接返回所有的行之外,将另外一个表的输出列设为 NULL。

RIGHT [OUTER]

指定在结果集中包含右表中所有不满足联接条件的行,且在由内联接返回的所有行之外,将与另外一个表对应的输出列设为 NULL。

<join_hint>

指定 SQL Server 查询优化器为在查询的 FROM 子句中指定的每个联接使用一个联接提示或执行算法。有关更多信息,请参见本主题下面的"联接提示"。

JOIN

指明所指定的联接操作应在给定的表或视图之间执行。

ON <search_condition>

指定联接所基于的条件。尽管经常使用列和比较运算符,但此条件可指定任何谓词,例如:

SELECT ProductID, Suppliers.SupplierID
    FROM Suppliers JOIN Products 
    ON (Suppliers.SupplierID = Products.SupplierID)

当条件指定列时,列不一定必须具有相同的名称或数据类型;但是,如果数据类型不一致,则这些列要么必须相互兼容,要么是 Microsoft® SQL Server™ 能够隐性转换的类型。如果数据类型不能隐式转换,则条件必须使用 CAST 函数显式转换数据类型。

在 ON 子句中可能有仅涉及一个联接表的谓词。这样的谓词也可能出现在查询中的 WHERE 子句中。尽管这种谓词的放置在 INNER 联接中不会产生差别,但是在涉及 OUTER 联接时可能会导致不同的结果。这是因为 ON 子句中的谓词在应用于联接之前先应用于表,而 WHERE 子句在语意上应用于联接结果。

有关搜索条件和谓词的更多信息,请参见搜索条件

CROSS JOIN

指定两个表的矢量积。这将返回相同的行,就好像在旧式的非 SQL-92 式联接中并没有指定 WHERE 子句。

表提示

表提示指定一个表扫描、查询优化器要使用的一个或多个索引或查询优化器要在该表中为该 SELECT 语句使用的锁定方法。虽然这是一个选项,但查询优化器通常无须指定提示就能够选择最佳优化方法。

注意  因为 SQL Server 查询优化器通常为查询选择最优执行计划,所以建议只将 <join_hint>、<query_hint>、<table_hint> 和 <view_hint> 作为经验丰富的开发人员和数据库管理员的最终手段。

如果查询计划不访问表,则忽略表提示。这可能是优化器作出完全不访问该表的选择的结果,或改为访问索引视图。在后一种情况中,使用 OPTION (EXPAND VIEWS) 查询提示可阻止使用索引视图。

鼓励在表提示之间使用逗号,尽管这是可选的。向后兼容性支持使用空格而不是逗号分隔提示。

鼓励使用 WITH 关键字,尽管目前这还不是必须。在将来的 SQL Server 版本中,WITH 可能会成为必需的关键字。

在 SQL Server 2000 中,所有的锁提示都传播给视图中引用的所有基表和视图。另外,SQL Server 执行相应的锁一致性检查。

如果表(包括系统表)中包含计算列,而这些计算列由访问其它表中的列的表达式或函数计算而得,则不在那些表上使用表提示(不传播表提示)。例如,在查询中的表上指定 NOLOCK 表提示。该表包含由访问另一表中的列的表达式和函数组合计算到的计算列。这些由表达式和函数引用的表在被访问时并不使用 NOLOCK 表提示。

对于 FROM 子句中的每个表,SQL Server 不允许有来自下列各组的多个表提示:

NOLOCK、READUNCOMMITTED 和 READPAST 表提示不能用于将进行删除、插入或更新操作的表。

语法

< table_hint > ::=
    
{ INDEX ( index_val [ ,...n ] )
        | FASTFIRSTROW
        | HOLDLOCK
        | NOLOCK
        | PAGLOCK
        | READCOMMITTED
        | READPAST
        | READUNCOMMITTED
        | REPEATABLEREAD
        | ROWLOCK
        | SERIALIZABLE
        | TABLOCK
        | TABLOCKX
        | UPDLOCK
        | XLOCK
    }

参数

INDEX ( index_val [ ,...n ] )

指定 SQL Server 在处理语句时使用的索引的名称或 ID。只能为每个表指定一个索引提示。

如果存在聚集索引,则 INDEX(0) 强制聚集索引扫描,而 INDEX(1) 强制聚集索引扫描或查找。如果不存在聚集索引,则 INDEX(0) 强制表扫描,而 INDEX(1) 则被解释为错误。

选择性的 INDEX = 语法(用于指定单一索引提示)只受向后兼容性的支持。

如果在单一提示列表中使用了多个索引,则将忽略重复项,所列出的其余索引将用于检索表中的行。索引提示中的索引顺序很重要。多索引提示还强制索引 ANDing,且 SQL Server 在所访问的每个索引上应用尽可能多的条件。如果带提示的索引集合不是覆盖性的,则在检索全部索引列后执行一次提取操作。

说明  如果在星型联接事实数据表中使用引用多个索引的索引提示,则 SQL Server 将忽略该索引提示并返回一条警告消息。此外,不允许在指定了索引提示的表上使用索引 OR 运算

表提示中的最大索引数为 250 个非聚集索引。

FASTFIRSTROW

等同于 OPTION (FAST 1)。有关更多信息,请参见 SELECT 中 OPTION 子句的 FAST。

HOLDLOCK

等同于 SERIALIZABLE。(有关更多信息,请参见本主题下面的 SERIALIZABLE。)HOLDLOCK 选项仅适用于指定了该选项的表或视图,且仅限于由它所在语句所定义的事务的时间段内。HOLDLOCK 不能用于包括 FOR BROWSE 选项的 SELECT 语句。

NOLOCK

等同于 READUNCOMMITTED。有关更多信息,请参见本主题后面的 READUNCOMMITTED。

PAGLOCK

在通常采取单个共享表锁的地方采取共享页锁。

READCOMMITTED

指定用与运行在 READ COMMITTED 隔离级别的事务相同的锁定语义执行扫描。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL

READPAST

指定跳过(越过读取)锁定的行。例如,假设表 T1 包含单个整数列,其值为 1、2、3、4 和 5。如果事务 A 将值 3 更改为 8,但尚未提交,则 SELECT * FROM T1 (READPAST) 将生成值 1、2、4 和 5。READPAST 仅适用于在 READ COMMITTED 隔离级别操作的事务,且只越过读取行级锁。该锁提示主要用于在 SQL Server 表中实现工作队列。

READUNCOMMITTED

指定允许脏读。这表示不发放共享锁,也不遵守排它锁。允许脏读会导致更高的并发性,但会降低一致性。如果指定了 READUNCOMMITTED,就有可能读取未提交的事务,或读取在读取过程中回滚的一套页,因此可能出现错误信息。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。

说明  如果在指定了 READUNCOMMITTED 的情况下收到 601 号错误信息,则按解决死锁错误 (1205) 的方法解决该错误,然后重试执行语句。

REPEATABLEREAD

指定用与运行在 REPEATABLE READ 隔离级别的事务相同的锁定语义执行扫描。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。

ROWLOCK

指定在通常采取单个共享页或表锁的情形下采取共享行锁。

SERIALIZABLE

等同于 HOLDLOCK。通过将共享锁保持到事务完成,使之更具有约束性(而不要不管事务是否完成,都在不再需要所需的表或数据页时就立即释放共享锁)。用与运行在 SERIALIZABLE 隔离级别的事务相同的语义执行扫描。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL

TABLOCK

指定在表上采取的共享锁一直保持到语句结束。如果同时指定 HOLDLOCK,那么在事务结束之前该共享表锁将一直保持。

TABLOCKX

指定在表上采取的排它锁一直保持到语句结束或事务结束。

UPDLOCK

指定读取表时采取更新锁而不是共享锁,且将这些更新锁保持到语句结束或事务结束。

XLOCK

指定应采取排它锁,且保持到由语句所处理的全部数据上的事务结束。如果与 PAGLOCK 或 TABLOCK 一同指定,则排它锁适用于适当的粒度级别。

视图提示

视图提示只能用于索引视图。(索引视图是创建了唯一聚集索引的视图。)如果查询包含对同时存在于索引视图和基表中的列的引用,且 Microsoft SQL Server™ 查询优化器决定执行查询的最好方法是使用索引视图,则优化器使用视图上的索引。该功能仅在 Microsoft SQL Server 2000 企业版和开发版上受支持。

但是,为了让优化器权衡各种索引视图,必须将下列 SET 选项设为 ON:

ANSI_NULLS ANSI_WARNINGS CONCAT_NULL_YIELDS_NULL
ANSI_PADDING ARITHABORT QUOTED_IDENTIFIERS

此外,NUMERIC_ROUNDABORT 选项必须设为 OFF。

若要强制优化器对索引视图使用索引,请指定 NOEXPAND 选项。可能仅当在查询中也命名视图时才能使用该提示。对于不直接在 FROM 子句中命名视图的查询,SQL Server 2000 不提供强制在这类查询中使用特定索引视图的提示;然而,即使在查询中不直接引用索引视图,查询优化器也会考虑使用索引视图。

视图提示仅允许用于 SELECT 语句,而不能用于在 INSERT、UPDATE 和 DELETE 语句中作为表源的视图中。

语法

< view_hint > ::=
{ NOEXPAND [ , INDEX ( index_val [ ,...n ] ) ] }

参数

NOEXPAND

指定当查询优化器处理查询时不扩展索引视图。查询优化器将视图作为具有聚集索引的表。

INDEX ( index_val [ ,...n ] )

指定 SQL Server 在处理语句时要使用的索引名称或 ID。只能为一个视图指定一个索引提示。

INDEX(0) 强制执行聚集索引扫描,而 INDEX(1) 强制执行聚集索引扫描或查找。

如果在单个提示列表中使用了多个索引,将忽略重复项,其余列出的索引将用于检索索引视图的行。索引提示中的索引顺序很重要。多索引提示还强制索引 ANDing,且 SQL Server 在所访问的每个索引上应用尽可能多的条件。如果带提示的索引的集合并不包含查询中所引用的全部列,则在检索全部索引列后执行一次提取操作。

联接提示

联接提示在查询的 FROM 子句中指定,可在两个表之间强制联接策略。如果为任意两个表指定了联接提示,查询优化器会根据 ON 关键字的位置,自动为查询中所有联接的表强制联接顺序。在 CROSS JOINS 的情况下,如果没有使用 ON 子句,可使用括号指明联接顺序。

注意  SQL Server 查询优化器通常为查询选择最优执行计划,所以建议只把 <join_hint>、<query_hint> 和 <table_hint> 作为经验丰富的数据库管理员的最终手段。

语法

< join_hint > ::=
    
{ LOOP | HASH | MERGE | REMOTE }

参数

LOOP | HASH | MERGE

指定查询中的联接应使用循环、哈希或合并。使用 LOOP | HASH | MERGE JOIN 将在两个表之间强制一个特定联接。

REMOTE

指定联接操作在右表处执行。这在左表是本地表而右表是远程表的情况下很有用。只在左表的行数少于右表行数时才能使用 REMOTE。

如果右表为本地表,则联接在本地执行。如果两个表均为远程表但来自不同的数据源,REMOTE 将使联接在右表处执行。如果两个表均为远程表且来自相同数据源,则不必使用 REMOTE。

当使用 COLLATE 子句将联接谓词中正进行比较的一个值投影到不同的排序规则时,不能使用 REMOTE。

REMOTE 只可用于 INNER JOIN 操作。

注释

FROM 子句支持用于联接表和派生表的 SQL-92-SQL 语法。SQL-92 语法提供 INNER、LEFT OUTER、RIGHT OUTER、FULL OUTER 和 CROSS 联接运算符。

虽然可以支持 SQL Server 较早版本中的外联接运算符,但不能在同一个 FROM 子句中同时使用外联接运算符和 SQL-92 样式的联接表。

FROM 子句内的 UNION 和 JOIN 在视图、派生表和子查询中均受支持。

自联接是与自身联接的表。基于自联接的插入和更新遵循 FROM 子句中的顺序。

因为 Microsoft SQL Server™ 2000 会考虑来自提供列分发统计信息的链接服务器上的分发及基数统计信息,所以,不一定非得需要 REMOTE 联接提示来强制远程评估联接。SQL Server 查询处理器将考虑远程统计信息并确定远程联接策略是否适当。REMOTE 联接提示对不提供列分发统计信息的提供程序非常有用。有关更多信息,请参见 OLE DB 提供程序的分布统计要求

权限

FROM 的权限默认为 DELETE、SELECT 或 UPDATE 语句的权限。

示例
A. 使用简单 FROM 子句

此示例从 publishers 表中检索 pub_idpub_name 列。

USE pubs
SELECT pub_id, pub_name
FROM publishers
ORDER BY pub_id

下面是结果集:

pub_id pub_name              
------ ---------------------
0736   New Moon Books        
0877   Binnet & Hardley      
1389   Algodata Infosystems  
1622   Five Lakes Publishing 
1756   Ramona Publishers     
9901   GGG&G                 
9952   Scootney Books        
9999   Lucerne Publishing    

(8 row(s) affected)
B. 使用 TABLOCK 和 HOLDLOCK 优化器提示

下面的部分事务显示了如何在 authors 上放置一个显式共享表锁,以及如何读取索引。该锁在整个事务中均保持。

USE pubs
BEGIN TRAN
SELECT COUNT(*) 
FROM authors WITH (TABLOCK, HOLDLOCK)
C. 使用 SQL-92 CROSS JOIN 语法

此示例返回 authorspublishers 两个表的矢量积。所返回的列表包含 au_lname 行和所有 pub_name 行的所有可能的组合。

USE pubs
SELECT au_lname, pub_name 
FROM authors CROSS JOIN publishers
ORDER BY au_lname ASC, pub_name ASC

下面是结果集:

au_lname                                 pub_name                        
---------------------------------------- ------------------------------- 
Bennet                                   Algodata Infosystems
Bennet                                   Binnet & Hardley
Bennet                                   Five Lakes Publishing
Bennet                                   GGG&G
Bennet                                   Lucerne Publishing
Bennet                                   New Moon Books
Bennet                                   Ramona Publishers
Bennet                                   Scootney Books
Blotchet-Halls                           Algodata Infosystems
Blotchet-Halls                           Binnet & Hardley
Blotchet-Halls                           Five Lakes Publishing
Blotchet-Halls                           GGG&G
Blotchet-Halls                           Lucerne Publishing
Blotchet-Halls                           New Moon Books
Blotchet-Halls                           Ramona Publishers
Blotchet-Halls                           Scootney Books
Carson                                   Algodata Infosystems
Carson                                   Binnet & Hardley
Carson                                   Five Lakes Publishing
...
Stringer                                 Scootney Books
White                                    Algodata Infosystems
White                                    Binnet & Hardley
White                                    Five Lakes Publishing
White                                    GGG&G
White                                    Lucerne Publishing
White                                    New Moon Books
White                                    Ramona Publishers
White                                    Scootney Books
Yokomoto                                 Algodata Infosystems
Yokomoto                                 Binnet & Hardley
Yokomoto                                 Five Lakes Publishing
Yokomoto                                 GGG&G
Yokomoto                                 Lucerne Publishing
Yokomoto                                 New Moon Books
Yokomoto                                 Ramona Publishers
Yokomoto                                 Scootney Books

(184 row(s) affected)
D. 使用 SQL-92 FULL OUTER JOIN 语法

此示例返回 titles 表中的书籍标题及对应的出版商。还返回未出版列在 titles 表中的书籍的出版商,以及不是由 publishers 表中所列的出版商出版的所有书籍标题。

USE pubs
-- The OUTER keyword following the FULL keyword is optional.
SELECT SUBSTRING(titles.title, 1, 10) AS Title, 
   publishers.pub_name AS Publisher
FROM publishers FULL OUTER JOIN titles
   ON titles.pub_id = publishers.pub_id
WHERE titles.pub_id IS NULL 
   OR publishers.pub_id IS NULL
ORDER BY publishers.pub_name

下面是结果集:

Title      Publisher                                
---------- ---------------------------------------- 
NULL       Five Lakes Publishing
NULL       GGG&G
NULL       Lucerne Publishing
NULL       Ramona Publishers
NULL       Scootney Books

(5 row(s) affected)
E. 使用 SQL-92 LEFT OUTER JOIN 语法

此示例在 au_id 上联接两个表,并保留左表中没有匹配项的行。authors 表与 titleauthor 表在各表的 au_id 列上相匹配。无论作品出版或未出版,所有作者均出现在结果集中。

USE pubs
-- The OUTER keyword following the LEFT keyword is optional.
SELECT SUBSTRING(authors.au_lname, 1, 10) AS Last,
   authors.au_fname AS First, titleauthor.title_id
FROM authors LEFT OUTER JOIN titleauthor
   ON authors.au_id = titleauthor.au_id

下面是结果集:

Last       First                title_id 
---------- -------------------- -------- 
White      Johnson              PS3333   
Green      Marjorie             BU1032   
Green      Marjorie             BU2075   
Carson     Cheryl               PC1035   
...                        ...      
McBadden   Heather              NULL
Ringer     Anne                 PS2091   
Ringer     Albert               PS2091   
Ringer     Albert               PS2106   

(29 row(s) affected)
F. 使用 SQL-92 INNER JOIN 语法

此示例返回所有出版商名称以及相应的所出版的书籍标题。

USE pubs
-- By default, SQL Server performs an INNER JOIN if only the JOIN 
-- keyword is specified.
SELECT SUBSTRING(titles.title, 1, 30) AS Title, publishers.pub_name
FROM publishers INNER JOIN titles 
   ON titles.pub_id = publishers.pub_id
ORDER BY publishers.pub_name

下面是结果集:

Title                          pub_name                                 
------------------------------ ---------------------------------------- 
The Busy Executive's Database  Algodata Infosystems                     
Cooking with Computers: Surrep Algodata Infosystems                     
Straight Talk About Computers  Algodata Infosystems                     
But Is It User Friendly?       Algodata Infosystems                     
Secrets of Silicon Valley      Algodata Infosystems                     
Net Etiquette                  Algodata Infosystems                     
Silicon Valley Gastronomic Tre Binnet & Hardley                         
The Gourmet Microwave          Binnet & Hardley                         
The Psychology of Computer Coo Binnet & Hardley                         
Computer Phobic AND Non-Phobic Binnet & Hardley                         
Onions, Leeks, and Garlic: Coo Binnet & Hardley                         
Fifty Years in Buckingham Pala Binnet & Hardley                         
Sushi, Anyone?                 Binnet & Hardley                         
You Can Combat Computer Stress New Moon Books                           
Is Anger the Enemy?            New Moon Books                           
Life Without Fear              New Moon Books                           
Prolonged Data Deprivation: Fo New Moon Books                           
Emotional Security: A New Algo New Moon Books                           

(18 row(s) affected)
G. 使用 SQL-92 RIGHT OUTER JOIN 语法

此示例在 pub_id 上联接两个表,并保留右表中没有匹配项的行。publishers 表与 titles 表在各表的 pub_id 上相匹配。无论是否已出版书籍,所有出版商均出现在结果集中。

USE pubs
SELECT SUBSTRING(titles.title, 1, 30) AS 'Title', publishers.pub_name
FROM titles RIGHT OUTER JOIN publishers 
   ON titles.pub_id = publishers.pub_id
ORDER BY publishers.pub_name

下面是结果集:

Title                          pub_name                                 
------------------------------ ---------------------------------------- 
The Busy Executive's Database  Algodata Infosystems                     
Cooking with Computers: Surrep Algodata Infosystems                     
Straight Talk About Computers  Algodata Infosystems                     
But Is It User Friendly?       Algodata Infosystems                     
Secrets of Silicon Valley      Algodata Infosystems                     
Net Etiquette                  Algodata Infosystems                     
Silicon Valley Gastronomic Tre Binnet & Hardley                         
The Gourmet Microwave          Binnet & Hardley                         
The Psychology of Computer Coo Binnet & Hardley                         
Computer Phobic AND Non-Phobic Binnet & Hardley                         
Onions, Leeks, and Garlic: Coo Binnet & Hardley                         
Fifty Years in Buckingham Pala Binnet & Hardley                         
Sushi, Anyone?                 Binnet & Hardley                         
NULL                           Five Lakes Publishing                    
NULL                           GGG&G                                    
NULL                           Lucerne Publishing                       
You Can Combat Computer Stress New Moon Books                           
Is Anger the Enemy?            New Moon Books                           
Life Without Fear              New Moon Books                           
Prolonged Data Deprivation: Fo New Moon Books                           
Emotional Security: A New Algo New Moon Books                           
NULL                           Ramona Publishers                        
NULL                           Scootney Books                           

(23 row(s) affected)
H. 使用 HASH 和 MERGE 联接提示

此示例在 authorstitleauthorstitles 表之间建立三表联接,以生成一个作者及其著作的列表。查询优化器使用 MERGE 联接将 authorstitleauthors (A x TA) 联接在一起。然后,将 authors titleauthors MERGE 联接 (A x TA) 的结果与 titles 表进行 HASH 联结以生成 (A x TA) x T。

重要  指定联接提示后,要执行 INNER JOIN 时 INNER 关键字不再为可选,而必须显式说明。

USE pubs
SELECT SUBSTRING((RTRIM(a.au_fname) + ' ' + LTRIM(a.au_lname)), 1, 25)
   AS Name, SUBSTRING(t.title, 1, 20) AS Title
FROM authors a INNER MERGE JOIN titleauthor ta 
   ON a.au_id = ta.au_id INNER HASH JOIN titles t 
   ON t.title_id = ta.title_id
ORDER BY au_lname ASC, au_fname ASC

下面是结果集:

Warning: The join order has been enforced because a local join hint is used.
Name                      Title                
------------------------- -------------------- 
Abraham Bennet            The Busy Executive's 
Reginald Blotchet-Halls   Fifty Years in Bucki 
Cheryl Carson             But Is It User Frien 
Michel DeFrance           The Gourmet Microwav 
Innes del Castillo        Silicon Valley Gastr 
...                    ...
Johnson White             Prolonged Data Depri 
Akiko Yokomoto            Sushi, Anyone?       

(25 row(s) affected)
I. 使用派生表

此示例使用派生表和紧跟 FROM 子句的 SELECT 语句,返回所有作者的姓名以及所著书的标题的书号。

USE pubs
SELECT RTRIM(a.au_fname) + ' ' + LTRIM(a.au_lname) AS Name, d1.title_id
FROM authors a, (SELECT title_id, au_id FROM titleauthor) AS d1
WHERE a.au_id = d1.au_id
ORDER BY a.au_lname, a.au_fname

下面是结果集:

Name                                                          title_id 
------------------------------------------------------------- -------- 
Abraham Bennet                                                BU1032   
Reginald Blotchet-Halls                                       TC4203   
Cheryl Carson                                                 PC1035   
Michel DeFrance                                               MC3021   
Innes del Castillo                                            MC2222   
Ann Dull                                                      PC8888   
Marjorie Green                                                BU1032   
Marjorie Green                                                BU2075   
Burt Gringlesby                                               TC7777   
Sheryl Hunter                                                 PC8888   
Livia Karsen                                                  PS1372   
Charlene Locksley                                             PC9999   
Charlene Locksley                                             PS7777   
Stearns MacFeather                                            BU1111   
Stearns MacFeather                                            PS1372   
Michael O'Leary                                               BU1111   
Michael O'Leary                                               TC7777   
Sylvia Panteley                                               TC3218   
Albert Ringer                                                 PS2091   
Albert Ringer                                                 PS2106   
Anne Ringer                                                   MC3021   
Anne Ringer                                                   PS2091   
Dean Straight                                                 BU7832   
Johnson White                                                 PS3333   
Akiko Yokomoto                                                TC7777   

(25 row(s) affected)

请参见

CONTAINSTABLE

DELETE

FREETEXTTABLE

INSERT

OPENQUERY

OPENROWSET

运算符

UPDATE

WHERE