分两次走的SQL语句,能否一次搞定?(SQL SERVER)(100分)

  • 主题发起人 主题发起人 jobsxy
  • 开始时间 开始时间
J

jobsxy

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个查询
第一步:统计出所查询的记录数:
Select count(*) from
........
第二步:查出相关数据:
Select a1,a2,a3 from
...........

由于这段SQL查询条件语句比较复杂,而且数据庞大,耗时太多,分两步走太累了,
因为都是同样的查询条件,能否只用一个查询语句就把记录数及相关数据表达出来?
 
这样可以吗
select count(*) as XX,a1,a2,a3 from
 
如果你是用 Query/ADOQuery 保留结果,
那么你可以只执行第二步,记录条数可以用 Query.RecordCount 获得
 
//由于这段SQL查询条件语句比较复杂,而且数据庞大,耗时太多,分两步走太累了,
//因为都是同样的查询条件,能否只用一个查询语句就把记录数及相关数据表达出来?
建议使用存储过程
 
select count(*),a1,..... from
 
用下面这种方式肯定不行嘛,
select count(*),a1,..... from
 
seaerwang的方法不行,因为未包含在聚合函数中,并且没有 GROUP BY 子句,这样混合会报错。
 
是啊,但是那个Query.RecordCount据说在C/S结构下并不准确
 
Select count(a1) as MyCount,a1,a2,a3 from...
 
直接执行第二个,然后:
DataSet.Last;
即是它的记录数=DataSet.RecNo
 
Query.RecordCount应该可以,只要你这些记录里没有什么文本类型等
比较特殊的类型就可以
 
SELECT a1,a2,a3,count(*) from TName
WHERE ...
 
建议行执行第二个再用query/adoquery.recordcount
svw0506的方法对sql不行,因为返回的值都会是-1.
 

不知道你到底要达到什么样的目的。根据我的理解。
既然查询条件相同,那么直接执行第二个sql就行。
至于记录数,引用属性recordcount 就可以了。
 
据说recordcount有时统计的数是不准确的,所有俺从来不用
 
关于 recordcount 的准确性问题,我已经查过有关资料
Query 的 recordcount 可能会引起一次内部SQL查询,而再次查询的结果可能不同,并且楼主的目的是为了加速
而其他非本地保存结果集的控件的 recordcount 会比较准确,
所以可以这样:
1。用一次 Query 查询
2。用 provider 把 Query 的内容全部复制到本地的一个 TClientDataSet 内存中
3。使用 ClientDataSet.recordcount
 
to 轻松虎:请您再解释一下,为什么“Query 的 recordcount 可能会引起一次内部SQL查询,
而再次查询的结果可能不同,”
我只是听说recordcount不准确,至于为什么始终搞不明白。
 
用存储过程可以在执行完select语名后
用@@ROWCOUNT获取影响的行数,就是记录数
不过我还知道delphi中如何同时取得两个结果集,有知道的,请赐教..
 
1。因为数据集可能在这两次查寻间隔中发生了变化导致结果集不同啊,尤其是查询条件复杂的情况。
2。不过我后来用 SQL TRACE 反复跟踪了 ADOQuery/ADOTable 的行为,发现并没有引起两次查寻,
我想直接用 ADOQuery1.RecordCount 就行了, 不放心也可以对你的查询试着跟踪一下。
 
select a1,a2,a3,count(*)
from
....
where
...
group by
a1,a2,a3
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部