資料庫表格連接:僅選擇每個訂單的第一個行項目
在資料庫操作中,連接像 Orders
和 LineItems
這樣的表時會出現一個常見的挑戰,其中一個訂單可以有多個關聯的行項目。 這通常會導致連線結果集中出現冗餘資料。 目標是有效率地僅檢索每個訂單的一個訂單項目。
簡單的方法可能涉及使用 TOP 1
,但這可能會導致子查詢中沒有正確的表引用的錯誤。
有效解:CROSS APPLY
和 JOIN
與 ORDER BY
兩種強大的方法有效地解決了這個問題:
方法一:使用CROSS APPLY
此方法使用 CROSS APPLY
將 Orders
表與子查詢連接起來,該子查詢為每個訂單選擇最上面的行項目:
<code class="language-sql">SELECT Orders.OrderNumber, LineItems2.Quantity, LineItems2.Description FROM Orders CROSS APPLY ( SELECT TOP 1 LineItems.Quantity, LineItems.Description FROM LineItems WHERE LineItems.OrderID = Orders.OrderID ) LineItems2;</code>
方法 2:將 JOIN
與 ORDER BY
此方法使用 JOIN
子句,其中連接條件從對訂單項目進行排序的子查詢中選擇 LineItemGUID
,並為每個訂單選擇最上面的一個:
<code class="language-sql">SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description FROM Orders JOIN LineItems ON LineItems.LineItemGUID = ( SELECT TOP 1 LineItemGUID FROM LineItems WHERE OrderID = Orders.OrderID ORDER BY LineItemGUID );</code>
這兩種方法都確保每個訂單只回傳一個訂單項目。 至關重要的是,在子查詢中包含 ORDER BY
子句對於確定性結果至關重要。 將 ORDER BY
與 TOP 1
一起省略會導致不可預測的結果,因為「第一個」行項目可能會因查詢執行而異。 使用 ORDER BY
可以保證根據所選的訂購標準一致地選擇特定的訂單項目。
以上是連接資料庫表時如何有效率地僅選擇每個訂單的第一個行項目?的詳細內容。更多資訊請關注PHP中文網其他相關文章!