根据特定条件选择数据,这是使用sql语句或使用sybase中的游标的存储过程的最佳解决方案

时间:2015-03-05 13:56:50

标签: sql sql-server sybase sybase-ase

SELECT distinct(a.acct_num)
FROM customer_acct a,
     customer_acct_history b LIKE "%000%"
WHERE a.acct_num *= b.acct_num
  AND acct_type='C'

此查询将返回表中的acct编号列表。基于此输出。我打算运行另一个Query并从其他表中选择各种数据。第二个查询包含各种连接,还有一个Group by和Order by。我想从第一个查询中选择每个帐号来自此查询的前1个数据,因为它是一个Big查询。

我打算使用带有For循环的Cursor来执行Process。它是一个高效的,还是只能使用Sql语句和循环来完成。任何Synatx都有助于以优化和省时的方式完成整个过程。

2 个答案:

答案 0 :(得分:1)

您可以创建临时表并分配第一个查询中的所有帐号。将一个标识列放入临时表,以便在表格中循环。

  create table #tmp_account(ID int identity not null,acct_num varchar(100)not null)

现在使用ID作为计数器循环遍历表。

Declare @vc_id int     
SELECT @vc_id=1 
set rowcount 1
WHILE EXISTS (SELECT  1 FROM #tmp_account  )
begin
select @ac_nm=acct_num from #tmp_account where ID=@vc_id

-- put your 2nd query here..you can insert resultset into another temp table.
delete from #tmp_account where ID=@vc_id
select @vc_id=@vc_id+1
end
set rowcount 0

答案 1 :(得分:0)

考虑使用游标。

可以在这里找到一个例子。

http://infocenter.sybase.com/help/in...ses/X61512.htm

declare c_account cursor for 
SELECT distinct(a.acct_num)
FROM customer_acct a,
customer_acct_history b LIKE "%000%"
WHERE a.acct_num *= b.acct_num AND acct_type='C'

@acc_num integer -- or whatever the column type is

begin

create table #foo ( col1 int, col2 varchar(255), col3 datetime)

open c_account 

fetch c_account into @acc_num 

while @@sqlstatus = 0
begin

insert into #foo (col1, col2, col3)
select top 1
col1, col2, col3
from
other_table ot
where
ot.col = @acc_num

fetch c_account into @acc_num
end

close c_account

deallocate c_account

end 
go

希望有所帮助,但我怀疑如果你这样做是一系列连接,这可能会更快。