2013-05-27 37 views
0

我在SQL Server OrdersOrderDetails中有兩個表。SQL Server查詢中的一對多關係

  • 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中。

謝謝。

+0

@ProgrammerIT,我嘗試了一些類似Ted所建議的東西。但我仍然無法正常工作。 –

回答

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

這種方法很簡單,我喜歡。但我也簡化了上面的問題。在我的ASP文件中,我實際上需要生成XML格式的數據(供其他腳本使用)。所以,屬於同一訂單的訂單細節需要在同一個XML元素中分組(如果我們使用表格類比,則在前一個td中)。 –

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

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

方案(c)是至少優選的,因爲它縮放可怕因爲數據庫調用的次數直接相關的訂單數。

方案(b)是最好的辦法,如果你使用的是ORM,但如果沒有一個簡單的解決方案(一)是通過存儲過程來快速檢索一氣呵成數據的好方法。

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