有些时候,你需要外部语句能够告诉子查询一些信息。在这种情况下,可以使用关联子查询,即包含一个把外部语句和子查询语句链接起来的查询条件。例如:下面SELECT语句的子查询通过ProductSubcategoryID列链接到外部语句: SELECT p.ProductID, p.Name, ( SELECT ps.Name FROM Production.ProductSubcategory ps WHERE p.ProductSubcategoryID = ps.ProductSubcategoryID ……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
有些时候,你需要外部语句能够告诉子查询一些信息。在这种情况下,可以使用关联子查询,即包含一个把外部语句和子查询语句链接起来的查询条件。例如:下面SELECT语句的子查询通过ProductSubcategoryID列链接到外部语句:
SELECT p.ProductID, p.Name, ( SELECT ps.Name FROM Production.ProductSubcategory ps WHERE p.ProductSubcategoryID = ps.ProductSubcategoryID ) AS SubcategoryName FROM Production.Product p WHERE p.ProductSubcategoryID IS NOT NULL AND p.Name LIKE '%seat%' |
在这个子查询的WHERE子句中,我把子查询语句的ProductSubcategory表的ProductSubcategoryID列和外部语句Product表的ProductSubcategoryID列关联起来。请注意,我使用表的别名来引用表(用p代表Product表和用ps代表ProductSubcategory表) 。这允许我在内部查询中引用外部表。
由于使用关联子查询,子查询基于ProductSubcategoryID列返回正确的ProductSubcategory名称。下表显示由SELECT语句返回的结果集:
ProductID | Name | SubcategoryName |
908 | LL Mountain Seat/Saddle | Saddles |
909 | ML Mountain Seat/Saddle | Saddles |
910 | HL Mountain Seat/Saddle | Saddles |
911 | LL Road Seat/Saddle | Saddles |
912 | ML Road Seat/Saddle | Saddles |
913 | HL Road Seat/Saddle | Saddles |
914 | LL Touring Seat/Saddle | Saddles |
915 | ML Touring Seat/Saddle | Saddles |
916 | HL Touring Seat/Saddle | Saddles |
我在前面的例子中使用表别名,能够很容易地确定ProductSubcategoryID列属于哪些表,但并不总是需要使用表别名。默认情况下,子查询假定一个未限定的列名属于在子查询中指定的表。如果子查询表不包括该列,那么就假定该表属于外部语句中的表。
所有这一切意味着,如果一个列在子查询的表和外部语句的表中都存在,你就必须限定该列属于你希望的外部语句中的表,如下面的例子所示:
SELECT ProductID, Name, ( SELECT Name FROM Production.ProductSubcategory WHERE ProductSubcategoryID = Production.Product. ProductSubcategoryID ) AS SubcategoryName FROM Production.Product WHERE ProductSubcategoryID IS NOT NULL AND Name LIKE '%seat%' |
正如你所看到的,我没有使用表别名。相反,我用架构名加上表名来限定子查询中第二个列名使用的是外部语句的表。该语句返回与上例相同的结果。
注意:你可能已经注意到,在第一个例子的子查询中引用了与外部查询相同的表。但是,在随后的两个例子中,子查询引用的表和外部语句的表不同。你可以采取两种方法在语句中添加子查询。
到目前为止我们研究的这些例子都是将SELECT语句作为外部语句,但你也可以将子查询用在INSERT、UPDATE和DELETE语句中。例如,下面的INSERT语句中子查询用来确定将值插入到一列中:
INSERT INTOProduction.Illustration (Diagram) VALUES ( ( SELECT Diagram FROM Production.Illustration WHERE IllustrationID = 7 ) ) |
子查询返回一个XML值,然后插入到Ilustration表的Diagram列。请注意,子查询要用一对括号括起来,另外一对括号则是将所有的值括起来。你在INSERT语句中使用子查询返回一个值,就像在语句中使用的其他任何值表达式一样。
你还可以在DELETE语句中包含子查询。例如,下面的例子使用子查询来确定Ilustration表中插入的最新一行:
DELETE Production.Illustration WHERE IllustrationID = ( SELECT MAX(IllustrationID) FROM Production.Illustration ) |
正如你所看到的,子查询作为WHERE子句查询条件的一部分。当IllustrationID值等于表中IllustrationID最大值时,该行被删除。
翻译
相关推荐
-
SQL Server 2016新变化:内存中OLTP功能大改进
SQL Server 2016的许多功能得到改进,内存中OLTP(in-memory OLTP)也不例外,包括扩展性、性能以及扩展T-SQL用于使用和管理内存优化表的功能方面。
-
优化T-SQL提升SQL Server数据库性能
本文中提供了八种优化T-SQL代码避免SQL Server数据库性能瓶颈的技巧,我们可以据此优化数据库应用。
-
配置SQL Server数据库恢复模式的两种方法
本文我们讨论了配置SQL Server恢复模式的两种方式,用T-SQL或者SQL Server管理工具都可以修改恢复模式的设置。
-
用T-SQL在SQL Server 2012中创建用户自定义角色
SQL Server 2012中引入了两项功能,即创建用户自定义服务器角色和分配服务器级别的权限。本文为初级DBA给出了一个用户自定义服务器角色的示范用例。