我在SQL Server Orders
和OrderDetails
中有两个表。
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中。
谢谢。
答案 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 Framework
或nHibernate
的ORM来填充反映您的表和关系结构的父/子对象模型。这样,表示层就可以写出对象模型(遍历每个父集合和子集合)。
(c)通过循环中的单独查询为每个订单加载每个订单详细信息集合。
选项(c)是最不受欢迎的,因为它的扩展非常严重,因为数据库调用的数量直接与订单数量相关。
选项(b)是使用ORM的最佳方法,但如果不是简单的解决方案(a)是通过存储过程一次快速检索数据的好方法。
请记住,如果您拥有大型数据集,则可能需要考虑实施paging
,因为在检索更多数据时性能会下降。