根据下面的代码返回第一个记录集(rs),该记录集基于日期范围返回一些值,然后在第二个记录集(rs2)中使用这些值来总结成本。进一步说明如下代码:
strSQL = "SELECT job, suffix, isnull(qty_scrapped,0),isnull(qty_released,0), isnull(price,0),co_num FROM vwDashboardsQuality "
strSQL &= " WHERE trans_date >= '" & dtpStartDate.Value & "' AND trans_date <= '" & dtpEndDate.Value & "' "
rs = conn.Execute(strSQL)
While Not rs.EOF
strCONUM = Trim("" & rs("co_num").Value)
strSelectString = "SELECT ISNULL(a_cost,0) FROM jobmatl WHERE job='" & rs("job").Value & "' AND suffix = " & Format(rs("suffix").Value)
rs2 = conn.Execute(strSelectString)
While Not rs2.EOF
dblSumActualMaterialCost = dblSumActualMaterialCost + CDbl(rs2(0).Value)
rs2.MoveNext()
End While
rs2.Close()
rs2 = Nothing
rs.MoveNext()
End While
rs.Close()
rs = Nothing
我想将查询合并到一个查询中,所以我没有通过第二个记录集(rs2)访问数据库只是为了总结一些我知道可以在一个查询中完成的事情。
任何提示都会有所帮助。提前谢谢。
答案 0 :(得分:3)
看起来您只需要对两个查询执行inner join
即可获得一个结果集。
看看这是否有效。如果是这样,您可以消除第二个查询和第二个内循环。
strSQL = "SELECT d.job, d.suffix, isnull(d.qty_scrapped,0), isnull(d.qty_released,0)," _
& " isnull(d.price,0), d.co_num, ISNULL(m.a_cost,0)" _
& " FROM vwDashboardsQuality d" _
& " INNER JOIN jobmatl m" _
& " ON d.job = m.job" _
& " AND d.suffix = m.suffix" _
& " WHERE trans_date >= '" & dtpStartDate.Value & "'" _
& " AND trans_date <= '" & dtpEndDate.Value & "'"
您可以将其粘贴到Management Studio中,将日期替换为适用的日期以检查结果。
SELECT d.job, d.suffix, isnull(d.qty_scrapped,0), isnull(d.qty_released,0), isnull(d.price,0), d.co_num,
ISNULL(m.a_cost,0)
FROM vwDashboardsQuality d
INNER JOIN jobmatl m
ON d.job = m.job
AND d.suffix = m.suffix
WHERE trans_date >= '2015-09-29'
AND trans_date <= '2015-09-30'
答案 1 :(得分:-1)
从您的代码中,我看到您最终只对SUM
的所有值运行jobmatl.a_cost
,以满足where子句设置的条件。那么为什么不在同一个查询上做所有事情呢?并且您将自己保存在结果集上的所有不必要的迭代,您将丢失以前的CPU时间和资源。
此外,您没有在第一个查询中使用所有其他值,为什么要将它们放在第一个位置?我从以下查询中删除了它们。
SELECT SUM(j.a_cost)
FROM vwDashboardsQuality vDQ
INNER JOIN jobmatl j
ON vDQ.job = j.job
AND vDQ.suffix = j.suffix
WHERE vDQ.trans_date >= @startdate
AND vDQ.trans_date <= @enddate;