给定VB.net代码,将多个查询合并为1

时间:2015-09-29 18:28:12

标签: sql vb.net

根据下面的代码返回第一个记录集(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)访问数据库只是为了总结一些我知道可以在一个查询中完成的事情。

任何提示都会有所帮助。提前谢谢。

2 个答案:

答案 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;