在SQL Server中如何使用子查询(下)

日期: 2010-07-26 作者:Robert Sheldon翻译:沈宏 来源:TechTarget中国 英文

有些时候,你需要外部语句能够告诉子查询一些信息。在这种情况下,可以使用关联子查询,即包含一个把外部语句和子查询语句链接起来的查询条件。例如:下面SELECT语句的子查询通过ProductSubcategoryID列链接到外部语句:   SELECT   p.ProductID,   p.Name,   (   SELECT ps.Name   FROM Production.ProductSubcategory ps   WHERE p.ProductSubcategoryID = ps.ProductSubcategoryID   ……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

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语句返回的结果集:

ProductIDNameSubcategoryName
908LL Mountain Seat/SaddleSaddles
909ML Mountain Seat/SaddleSaddles
910HL Mountain Seat/SaddleSaddles
911LL Road Seat/SaddleSaddles
912ML Road Seat/SaddleSaddles
913HL Road Seat/SaddleSaddles
914LL Touring Seat/SaddleSaddles
915ML Touring Seat/SaddleSaddles
916HL Touring Seat/SaddleSaddles

  我在前面的例子中使用表别名,能够很容易地确定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最大值时,该行被删除。

翻译

沈宏
沈宏

相关推荐