2007-09-27

在SQL Server中使用相关子查询

来源: 本站收集整理 作者: 评论 0 条
 

子查询是指将一条SQL Sever语句嵌入到另一条SQL Sever语句中。数据库引擎将子查询做为虚表执行查询操作。子查询可做为连接语句中的一个表,可做为选择语句中的一个值,也可以是SQL Sever查询子句,还可以是SQL Sever查询子句的字句,与数据操作语句混合在一起。

子查询的执行依靠于嵌套查询。查询树从最里层开始,一层一层向外执行。高层的嵌套查询可以访问低层嵌套查询的结果。

什么是相关子查询?

与经典子查询不同,相关子查询依靠于外部查询。外部查询和子查询是有联系的,尤其在子查询的WHERE语句中更是如此。相关子查询的工作方式是:在子查询中找到外部查询的参考时执行外部查询,此时将结果返回给子查询。然后在外部查询返回的结果集上执行子查询操作。

相关子查询的执行性能

由于相关子查询中的子查询在外部查询返回的结果集上进行执行,其效率肯定下降。子查询的性能完全依靠于查询和有关的数据。但是,假如相关子查询的语句写得很有效率,则其执行性能能够胜过那些使用几个连接和临时表的程序。

一个示例

相关子查询的一个主要优点在于,它能完成传统SQL Sever查询不能解决的问题。例如,使用相关子查询可以轻易完成这样的任务:获得连续的销售总计结果或每一个州中出售最多的商品。

下面的例子说明了如何使用相关子查询创建运行总计的过程。首先,运行下面的脚本创建一个例表:

CREATE TABLE SalesHistory

(SaleID INT IDENTITY(1,1),
Product VARCHAR(30),
SaleDate SMALLDATETIME,
SalePrice MONEY

)

现在,这个表保存了这些数据字段,让我们运行脚本程序向其中添加一些记录。Listing A中显示了向表中输入的300条记录的程序,其中SalePrice有些变化。

Listing A

DECLARE @i SMALLINT
SET @i = 1

WHILE (@i <=100)
BEGIN
INSERT INTO SalesHistory
(Product, SaleDate, SalePrice)
VALUES
('Computer', DATEADD(mm, @i, '3/11/1919'), DATEPART(ms, GETDATE()) (@i 57) )

INSERT INTO SalesHistory
(Product, SaleDate, SalePrice)
VALUES
('BigScreen', DATEADD(mm, @i, '3/11/1927'), DATEPART(ms, GETDATE()) (@i 13) )

INSERT INTO SalesHistory
(Product, SaleDate, SalePrice)
VALUES
('PoolTable', DATEADD(mm, @i, '3/11/1908'), DATEPART(ms, GETDATE()) (@i 29) )

SET @i = @i 1
END

虽然SalePrice的变化不大,但是也足以说明相关子查询如何工作。接下来,运行Listing B中的相关子查询程序创建销售报表。

Listing B

SELECT
SaleDate, Product, SalePrice,
ISNULL(
(
SELECT
SUM(SalePrice)
FROM
SalesHistory sh1
WHERE
Sh1.Product = sh.Product AND
Sh1.SaleID < sh.SaleID
),0) AS RunningTotal
FROM SalesHistory sh
ORDER BY Product, SaleID

在报表中引入的连续的销售总计查询即是相关子查询。对于表中的每种产品,相关子查询重述了其结果集,并且在将结果返回到结果集之前,为每一种售出产品的SalePrice进行加和操作。
共2页: 上一页 1 [2] 下一页

(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:在SQL Server中如何用通配符搜索TEXT栏  
下一篇:理解SQL Server 中的错误处理
    评论加载中…
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号