指定在 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_name、view_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 在所访问的每个索引上应用尽可能多的条件。如果带提示的索引集合不是覆盖性的,则在检索全部索引列后执行一次提取操作。
说明 如果在
表提示中的最大索引数为 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 语句的权限。
此示例从 publishers 表中检索 pub_id 和 pub_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)
下面的部分事务显示了如何在 authors 上放置一个显式共享表锁,以及如何读取索引。该锁在整个事务中均保持。
USE pubs
BEGIN TRAN
SELECT COUNT(*)
FROM authors WITH (TABLOCK, HOLDLOCK)
此示例返回 authors 和 publishers 两个表的矢量积。所返回的列表包含 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)
此示例返回 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)
此示例在 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)
此示例返回所有出版商名称以及相应的所出版的书籍标题。
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)
此示例在 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)
此示例在 authors、titleauthors 和 titles 表之间建立三表联接,以生成一个作者及其著作的列表。查询优化器使用 MERGE 联接将 authors 和 titleauthors (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)
此示例使用派生表和紧跟 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)