ADO: 可否在已有的记录集中再做一次查询

xdd1125 2001-07-20 10:44:34
...全文
166 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhp 2001-07-20
  • 打赏
  • 举报
回复
msdn中不是有现存的例子吗?用requery搜索一下。
xdd1125 2001-07-20
  • 打赏
  • 举报
回复
请回答:sos,sos,sos
xdd1125 2001-07-20
  • 打赏
  • 举报
回复
requery的条件是改变了的
xdd1125 2001-07-20
  • 打赏
  • 举报
回复
请问zzj:
recordset.requery怎样用,给个例子好吗
zzj 2001-07-20
  • 打赏
  • 举报
回复
RecordSet.reQuery
BrentIvan 2001-07-20
  • 打赏
  • 举报
回复
可以,利用RecordSet.Filter
比如: RecordSet.Filter = "columnname = 'columnvalue'"
xdd1125 2001-07-20
  • 打赏
  • 举报
回复
TO: DTWUJP(建平)
谢谢你,我正在找子查询的有关资料,:)
给分了
DTWUJP 2001-07-20
  • 打赏
  • 举报
回复
或建一个临时表,让用户在临时表中在查。
DTWUJP 2001-07-20
  • 打赏
  • 举报
回复
子查询基础知识
子查询是一个 SELECT 查询,它返回单个值且嵌套在 SELECT、INSERT、UPDATE、DELETE 语句或其它子查询中。任何允许使用表达式的地方都可以使用子查询。下例中,一个子查询用作 SELECT 语句中名为 MaxUnitPrice 的列表达式。

SELECT Ord.OrderID, Ord.OrderDate,
(SELECT MAX(OrdDet.UnitPrice)
FROM Northwind.dbo.[Order Details] AS OrdDet
WHERE Ord.OrderID = OrdDet.OrderID) AS MaxUnitPrice
FROM Northwind.dbo.Orders AS Ord

子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。

许多包含子查询的 Transact-SQL 语句都可以改为用联接表示。而其它一些问题只能由子查询提出。在 Transact-SQL 中,包括子查询的语句和不包括子查询但语义上等效的语句在性能方面通常没有区别。但是,在一些必须检查存在性的情况中,使用联接会产生更好的性能。否则,为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询。所以在这些情况下,联接方式会产生更好的效果。下面的示例显示返回相同结果集的 SELECT 子查询和SELECT 联接:

/* SELECT statement built using a subquery. */
SELECT ProductName
FROM Northwind.dbo.Products
WHERE UnitPrice =
(SELECT UnitPrice
FROM Northwind.dbo.Products
WHERE ProductName = 'Sir Rodney''s Scones')

/* SELECT statement built using a join that returns
the same result set. */
SELECT Prd1.ProductName
FROM Northwind.dbo.Products AS Prd1
JOIN Northwind.dbo.Products AS Prd2
ON (Prd1.UnitPrice = Prd2.UnitPrice)
WHERE Prd2.ProductName = 'Sir Rodney''s Scones'

嵌套在外部 SELECT 语句中的子查询包括以下组件:

包含标准选择列表组件的标准 SELECT 查询。


包含一个或多个表或者视图名的标准 FROM 子句。


可选的 WHERE 子句。


可选的 GROUP BY 子句。


可选的 HAVING 子句。
子查询的 SELECT 查询总是使用圆括号括起来。且不能包括 COMPUTE 或 FOR BROWSE 子句,如果同时指定 TOP 子句,则可能只包括 ORDER BY 子句。

子查询可以嵌套在外部 SELECT、INSERT、UPDATE 或 DELETE 语句的 WHERE 或 HAVING 子句内,或者其它子查询中。尽管根据可用内存和查询中其它表达式的复杂程度不同,嵌套限制也有所不同,但嵌套到 32 层是可能的。个别查询可能会不支持 32 层嵌套。任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。

如果某个表只出现在子查询中而不出现在外部查询中,那么该表中的列就无法包含在输出中(外部查询的选择列表)。

包括子查询的语句通常采用以下格式中的一种:

WHERE expression [NOT] IN (subquery)


WHERE expression comparison_operator [ANY | ALL] (subquery)


WHERE [NOT] EXISTS (subquery)
在某些 Transact-SQL 语句中,子查询可以像一个独立的查询一样进行评估。从概念上讲,子查询结果将代入外部查询中(尽管不必知道 Microsoft® SQL Server™ 实际上如何通过子查询处理 Transact-SQL 语句)。

有三种基本的子查询。它们是:

在通过 IN 引入的列表或者由 ANY 或 ALL 修改的比较运算符的列表上进行操作。


通过无修改的比较运算符引入,并且必须返回单个值。


通过 EXISTS 引入的存在测试。
子查询规则
子查询受以下条件的限制:

通过比较运算符引入的子查询的选择列表只能包括一个表达式或列名称(分别对 SELECT * 或列表进行 EXISTS 和 IN 操作除外)。


如果外部查询的 WHERE 子句包括某个列名,则该子句必须与子查询选择列表中的该列在联接上兼容。


子查询的选择列表中不允许出现 ntext、text 和 image 数据类型。


由于必须返回单个值,所以由无修改的比较运算符(指其后未接关键字 ANY 或 ALL)引入的子查询不能包括 GROUP BY 和 HAVING 子句。


包括 GROUP BY 的子查询不能使用 DISTINCT 关键字。


不能指定 COMPUTE 和 INTO 子句。


只有同时指定了 TOP,才可以指定 ORDER BY。


由子查询创建的视图不能更新。


按约定,通过 EXISTS 引入的子查询的选择列表由星号 (*) 组成,而不使用单个列名。由于通过 EXISTS 引入的子查询进行了存在测试,并返回 TRUE 或 FALSE 而非数据,所以这些子查询的规则与标准选择列表的规则完全相同。
子查询类型
可以在许多地方指定子查询:

使用别名时


使用 IN 或 NOT IN 时


在 UPDATE、DELETE 和 INSERT 语句中


使用比较运算符时


使用 ANY、SOME 或 ALL 时


使用 EXISTS 或 NOT EXISTS 时


在有表达式的地方


多层嵌套
子查询自身可以包括一个或多个子查询。一个语句中可以嵌套任意数量的子查询。

下面的查询查找至少曾参与编写一本热门计算机书的作者姓名。

USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE au_id IN
(SELECT au_id
FROM titleauthor
WHERE title_id IN
(SELECT title_id
FROM titles
WHERE type = 'popular_comp'))

下面是结果集:

au_lname au_fname
---------------------------------------- --------------------
Carson Cheryl
Dull Ann
Locksley Charlene
Hunter Sheryl

(4 row(s) affected)

最内部的查询返回书名 ID 号 PC1035、PC8888 和 PC9999。再上一层的查询使用这些书名 ID 进行评估,并返回作者的 ID 号。最后,外部查询使用作者的 ID 号查找作者的姓名。

也可以使用一个联接表示该查询:

USE pubs
SELECT au_lname, au_fname
FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id
JOIN titles ON titleauthor.title_id = titles.title_id
WHERE type = 'popular_comp'


相关子查询
许多查询都可以通过执行一次子查询并将结果值代入外部查询的 WHERE 子句进行评估。在包括相关子查询(也称为重复子查询)的查询中,子查询依靠外部查询获得值。这意味着子查询是重复执行的,为外部查询可能选择的每一行均执行一次。

下面的查询查找获得某本书 100 % 共享版税 (royaltyper) 的所有作者名。

USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE 100 IN
(SELECT royaltyper
FROM titleauthor
WHERE titleauthor.au_ID = authors.au_id)

下面是结果集:

au_lname au_fname
---------------------------------------- --------------------
White Johnson
Green Marjorie
Carson Cheryl
Straight Dean
Locksley Charlene
Blotchet-Halls Reginald
del Castillo Innes
Panteley Sylvia
Ringer Albert

(9 row(s) affected)

与以前提到的大多数子查询不同,该语句中的子查询无法独立于主查询而得到解决。该子查询需要一个 authors.au_id 值,而该值是个变量,随 Microsoft® SQL Server™ 检查 authors 表中的不同行而更改。

下面准确说明如何评估该查询:SQL Server 考虑 authors 表中的每一行是否都包括在结果中,方法是将每一行的值都代入内部查询中。例如,如果 SQL Server 首先检查 Cheryl Carson 行,那么变量 authors.au_id 将取值 238-95-7766,SQL Server 将该值代入到内部查询中。

USE pubs
SELECT royaltyper
FROM titleauthor
WHERE au_id = '238-95-7766'

结果为 100,所以外部查询评估为:

USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE 100 IN (100)

由于这是真的,因此 Cheryl Carson 行包括在结果中。对 Abraham Bennet 行运行相同的过程,会发现该行没有包括在结果中。

©1988-2000 Microsoft Corporation。保留所有权利。
供你参考。


xdd1125 2001-07-20
  • 打赏
  • 举报
回复
TO : DTWUJP(建平)

子查询
这个建议好,select * from QueryDef where ...
可是我的过程是这样的:用户先检索到一些记录,然后再根据另外的条件从中再找出所需记录
这条语句是一次性检索(而且ADO中没有QueryDef,好象王国荣书上讲过子查询.....)
DTWUJP 2001-07-20
  • 打赏
  • 举报
回复
用子查询。看sqlserver2000在线帮助。
moonbaby 2001-07-20
  • 打赏
  • 举报
回复
可以将以有的记录集作为一个数据源,如ss=“select * from table where ...."
在对ss进行查询
benlovekelly 2001-07-20
  • 打赏
  • 举报
回复
为什么要这样做尼?
bgxy 2001-07-20
  • 打赏
  • 举报
回复
gz
xdd1125 2001-07-20
  • 打赏
  • 举报
回复
我的意思是在已检索出的recordset中再一次用新的查询条件检索,象DAO中的rs.openrecordset的一样。ADO可以吗?
joo 2001-07-20
  • 打赏
  • 举报
回复
能把例子写的详细一些吗?

7,757

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧