Sql 除了游标,我还有别的选择吗

Sql 除了游标,我还有别的选择吗,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,在此输入代码我正在开发一个复杂的报告,为此我需要从表1中选择一些数据,然后代表表1中的数据对表2、表3、表4中的数据执行一些处理 像 做 我已经试过了,但子查询不能解决我的问题。 正如我所知,游标是我唯一的选择,如果有任何其他解决方案,请指导我 问候 当时,我在客户端处理数据,然后将其保存到数据库中的临时表中,然后将该表中的记录提取到crystal report中。这是我的密码 rs.Open "SELECT distinct Empid,empSalary as EmpSalary,EmpJo

在此输入代码我正在开发一个复杂的报告,为此我需要从表1中选择一些数据,然后代表表1中的数据对表2、表3、表4中的数据执行一些处理

我已经试过了,但子查询不能解决我的问题。 正如我所知,游标是我唯一的选择,如果有任何其他解决方案,请指导我

问候

当时,我在客户端处理数据,然后将其保存到数据库中的临时表中,然后将该表中的记录提取到crystal report中。这是我的密码

rs.Open "SELECT distinct Empid,empSalary as EmpSalary,EmpJobStatus From TEmployee where EmpJobStatus ='HIRED' and EmpID not in ( SELECT distinct Empid From VEmpPromotion where convert(VARCHAR(10), PromSalaryMonth , 101)='" & Format(FirstDate, "mm/dd/yyyy") & "') Union SELECT distinct Empid,promempSalary as EmpSalary,PromEmpJobStatus as EmpJobStatus From VEmpPromotion where PromEmpJobStatus ='HIRED' and convert(VARCHAR(10), PromSalaryMonth , 101)='" & Format(FirstDate, "mm/dd/yyyy") & "'", cn, 3, 2


While Not rs.EOF
rsD1.Open "select sum(DATEDIFF(MINUTE,timein,timeout))/60 as HoursWorked ,count(EmpLEave) as EmpLeave,count(TimeIN) as DaysWorked from Tattendance where EmpId =" & rs![EmpId] & " and convert(VARCHAR(10), Attendate, 101)>='" & Format(FirstDate, "mm/dd/yyyy") & "' and convert(VARCHAR(10), attendate, 101)<='" & Format(LastDate, "mm/dd/yyyy") & "'", cn, 3, 2
rsD2.Open "select sum(amount),SUM(CASE EmpTrancID WHEN 1  then amount  ELSE 0 END) AS 'SalaryPaid',SUM(CASE EmpTrancID WHEN 2  then amount  ELSE 0 END) AS 'SalaryAdvancePaid',SUM(CASE EmpTrancID WHEN 3  then amount  ELSE 0 END) AS 'WeeklyIncentivePaid',SUM(CASE EmpTrancID WHEN 4  then amount  ELSE 0 END) AS 'MonthlyIncentivePaid',SUM(CASE EmpTrancID WHEN 5  then amount  ELSE 0 END) AS 'InitialAdvancePaid',SUM(CASE EmpTrancID WHEN 6  then amount  ELSE 0 END) AS 'OtherPayments',SUM(CASE EmpTrancID WHEN 7  then amount  ELSE 0 END) AS 'SalaryAdvanceBack',SUM(CASE EmpTrancID WHEN 8  then amount  ELSE 0 END) AS 'InitialAdvanceBack'From TSalAdvance where TrancStatus =1 and EmpId =" & rs![EmpId] & " and convert(VARCHAR(10), PaidDate, 101)<= '" & Format(DTSearch, "mm/dd/yyyy") & "' and convert(VARCHAR(10), PaidDate, 101)>= '" & Format(FirstDate, "mm/dd/yyyy") & "'", cn, 3, 2
rsD4.Open "select sum(amount),SUM(CASE EmpTrancID WHEN 8  then amount  ELSE 0 END) AS 'TInitialAdvanceBack',SUM(CASE EmpTrancID WHEN 5  then amount  ELSE 0 END) AS 'TInitialAdvancePaid'From TSalAdvance where TrancStatus =1 and EmpId =" & rs![EmpId] & " and convert(VARCHAR(10), SalaryMonth, 101)<'" & Format(LastDate, "mm/dd/yyyy") & "'", cn, 3, 2
rsD5.Open "select sum(amount),SUM(CASE EmpTrancID WHEN 2  then amount  ELSE 0 END) AS 'SalaryAdvancePaid',SUM(CASE EmpTrancID WHEN 7  then amount  ELSE 0 END) AS 'SalaryAdvanceBack'From TSalAdvance where TrancStatus =1 and EmpId =" & rs![EmpId] & " and convert(VARCHAR(10), SalaryMonth, 101)>'" & Format(LastDate, "mm/dd/yyyy") & "'", cn, 3, 2
If IsNull(rsD5![SalaryAdvancePaid]) Then NextAdvPaid = 0 Else NextAdvPaid = rsD5![SalaryAdvancePaid]
If IsNull(rsD5![SalaryAdvanceBack]) Then NextAdvBAck = 0 Else NextAdvBAck = rsD5![SalaryAdvanceBack]
rsD3.Open "select * from SalarySummaryAll", cn, 3, 2
rsD3.AddNew
rsD3![EmpId] = rs![EmpId]
rsD3![EmpSalary] = rs![EmpSalary]
rsD3![EmpJobStatus] = Trim(rs![EmpJobStatus])
.........
.........
rsD3.Update
rs.MoveNext
Wend

您的查询看起来很长,但似乎没有使用太多变量

我不明白为什么不能在这里使用一些内部联接和左外部联接,如:

insert into SalarySummaryAll(EmpId, EmpSalary, ...)
select (TEmployeeAlias.EmpIdAlias, TEmployeeAlias.EmpSalaryAlias, ...) 
from
  (select .... From TEmployee where ...) as TEmployeeAlias
  inner join 
  (select ... From TSalAdvance where ...) as TSalAdvance Alias
     on ...
  inner join  
  (select ... From TSalAdvance where ...) as TSalAdvance Alias
     on ...
  left outer join
  (select...) as tableN 
     on ...

你试过这样的东西吗?如果是,您遇到了什么问题?

请显示表格结构、示例输入和所需输出。如果没有这些信息,你的问题就太模糊了,无法回答。这是工资单报告,包括以下内容info@user1115284-除非您的要求是降低操作速度,否则很少需要使用游标,但正如jachguate已经提到的,对于如何使用基于集合的方法解决此问题,无法向您提供更精确的建议。很抱歉给您带来不便。这是包含以下信息的工资单报告。它从晋升表和emp表中获取员工id,然后从考勤表中收集其信息,包括上班时间、下班时间、休假、缺勤时间、加班时间和加班时间,对这些信息进行一些处理,然后从薪资表中获取信息,然后从薪资预付表中代表考勤表计算薪资。所有表都与emp id连接,需要处理两个日期间隔之间的数据。如果需要,我可以给所有5-6个表提供数据类型的结构,但我想我会让问题变得更长更复杂
insert into SalarySummaryAll(EmpId, EmpSalary, ...)
select (TEmployeeAlias.EmpIdAlias, TEmployeeAlias.EmpSalaryAlias, ...) 
from
  (select .... From TEmployee where ...) as TEmployeeAlias
  inner join 
  (select ... From TSalAdvance where ...) as TSalAdvance Alias
     on ...
  inner join  
  (select ... From TSalAdvance where ...) as TSalAdvance Alias
     on ...
  left outer join
  (select...) as tableN 
     on ...