簡體   English   中英

SQL Server查詢中的一對多關系

[英]One to many relationship in SQL Server query

我在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中。

謝謝。

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 %>

你有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(如Entity FrameworknHibernate填充反映表和關系結構的父/子對象模型。 這樣,表示層就可以寫出對象模型(遍歷每個父集合和子集合)。

(c)通過循環中的單獨查詢為每個訂單加載每個訂單詳細信息集合。

選項(c)是最不受歡迎的,因為它的擴展非常嚴重,因為數據庫調用的數量直接與訂單數量相關。

如果您使用ORM,則選項(b)是最佳方法,但如果不是簡單解決方案(a)是通過存儲過程一次快速檢索數據的好方法。

請記住,如果您有大型數據集,則可能需要考慮實現paging ,因為在檢索更多數據時性能會降低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM