0

我在 SQL ServerOrdersOrderDetails.

  • Orders包含OrderID等。
  • OrderDetails包含OrderID, ItemID,Quantity等等

这两个表具有一对多的关系。一份订单可以有很多商品。

从这两个表中检索记录的最佳方法是什么,以便当我在我的 ASP 页面中显示记录时,它将具有以下表格格式?

OrderID ItemID Quantity
    1    156     1
    2    156     2
         150     1
         188     1
    3    245     1
         344     1

最简单的方法是通过查询从主循环内的表中检索详细信息OrderDetails,但这将非常耗费资源。

有没有更好的方法来实现这一目标?

数据库在 SQL Server 中,我的页面在经典 ASP 中。

谢谢你。

4

2 回答 2

2

SQL:

select    o.OrderID, d.ItemID, d.Quantity
from      Orders o
          inner join OrderDetails d on o.OrderID = d.OrderID
order by  o.OrderID, d.ItemID

ASP:

将最后一个存储OrderID在一个变量中,每当它与上次不同时打印它,否则打​​印一个空<td>

<% 
set lastId = -1
do while not objRS.EOF 
%>
  <tr>
<% if lastId <> objRs("OrderID") then %>
    <td><%= objRs("OrderID") %></td>
<% else %>
    <td></td>
<% end if %>
    <td><%= objRs("ItemID") %></td>
    <td><%= objRs("Quantity") %></td>
  </tr>
<% 
lastId = objRs("OrderID")
loop %>
于 2013-05-27T09:28:52.440 回答
0

您在这里有 3 个选项:

(a) 创建一个stored procedure将关系“扁平化”为单行,然后您的表示层可以有选择地选择隐藏或显示的内容。实际上,您的查询应该将以下数据返回到业务对象中:

OrderID ItemID Quantity
    1    156     1
    2    156     2
    2    150     1
    2    188     1
    3    245     1
    3    344     1

然后,您的 UI 必须处理显示父子关系和隐藏重复订单的复杂性。

(b) 使用 ORM like Entity FrameworkornHibernate填充反映您的表和关系结构的父/子对象模型。这样表示层可以只写出对象模型(遍历每个父子集合)。

(c) 通过一个单独的查询在每个订单的循环中加载每个订单详细信息集合。

选项 (c) 是最不受欢迎的,因为它的扩展性非常大,因为数据库调用的数量与订单数量直接相关。

如果您使用的是 ORM,选项 (b) 是最佳方法,但如果不是简单的解决方案 (a) 是通过存储过程一次性快速检索数据的好方法。

请记住,如果您有大型数据集,您可能需要考虑实施paging,因为当您检索更多数据时性能会降低。

于 2013-05-27T09:30:23.463 回答