SQL Server查询中的一对多关系

时间:2013-05-27 09:26:20

标签: sql sql-server asp-classic

我在SQL Server OrdersOrderDetails中有两个表。

  • Orders包含OrderID等等。
  • OrderDetails包含OrderIDItemIDQuantity等。

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

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

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

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

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

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

谢谢。

2 个答案:

答案 0 :(得分: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 %>

答案 1 :(得分: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)使用类似Entity FrameworknHibernate的ORM来填充反映您的表和关系结构的父/子对象模型。这样,表示层就可以写出对象模型(遍历每个父集合和子集合)。

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

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

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

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