如何合并数据库调用的结果?

时间:2009-02-08 15:29:06

标签: c# asp.net ado.net .net-2.0

我有一份网络报告需要从不同地区返回多个产品。 简化的查询将如下:

Select ProductName, ProductPrice 
from Product
where Region in (Region1, Region2, Region 3)

用户从UI中选择区域。结果绑定到数据网格。它可能是多个地区。但结果将如下所示

        ProductName,  ProductPrice [Region 1] ProductPrice [Region 2] ...
Prod1
Prod2
....

产品与同一地区不同。某些地区的某些可能为空。要动态绑定到网格,我使用的是DataTable,然后为区域字段动态添加数据列。最简单的方法是循环每个区域查询的结果,然后按产品合并(1,2,3 ......)它可以工作,但速度很慢,特别是对于超过2K的行。我想知道是否有任何方法可以避免做嵌套循环。

3 个答案:

答案 0 :(得分:1)

您使用的是SQL Server吗?如果是这样,您可以使用PIVOT operator在该区域上进行转动。

答案 1 :(得分:0)

我认为我们可能需要更多关于您正在使用的查询和循环的信息,但是您可以使用AJAX吗?听起来你想让UI体验更加愉快,并且可以获得“按需”区域的信息

答案 2 :(得分:0)

对不起,下面的第一个答案是哑弹。如果我理解正确,您可以按产品顺序填充DataRows,循环结果集:

Select ProductName, ProductPrice, Region 
from Product
where Region in (Region1, Region2, Region 3)
ORDER BY ProductID, Region

为每个新产品ID创建一个新的DataRow,每个区域都有一个带有ProductPrice值的DataColumn(或什么都没有)。


问题中缺少必要的详细信息,但总的来说,我建议让DBMS处理聚合(如果您使用的是数据库?)。二维聚合应该很快。

  1. 在按区域和按产品划分的SQL查询组中,使用汇总函数计算您的金额(例如金钱,数量)。你应该得到(产品,组,数量)元组的结果集,其中金额是所需的聚合,或者是NULL
  2. 在ASP.NET循环中通过结果集并构建数据表
  3. 将数据表绑定到网格控件
  4. 即使此方法不合适,也请尝试从您的数据源最小化查询次数。查询的数量永远不应该依赖于网格列/行计数。