在 SQL 連線中僅選擇相關表格中的第一行
資料庫連線通常會從相關表中檢索多個符合的行。 本文解決了即使存在多個符合項,您也需要將聯結限制為每個父記錄的單行的情況。 這可以防止查詢輸出中出現重複結果。
挑戰
考慮兩個表:Orders
和 LineItems
。 通常,一份訂單有一個行項目,但有些訂單可能有多個行項目。 顯示訂單詳細資訊時,每個訂單僅顯示一個訂單項目至關重要,否則會導致結果重複混亂。
最初的方法(及其失敗)
在聯結中使用 TOP 1
的天真嘗試會直接失敗,因為內部查詢無法存取外部表的列(如 OrderID
)。
解:交叉應用與內部連結
最有效的方法是使用 CROSS APPLY
(在 SQL Server 2005 及更高版本中可用)或針對舊版本的巧妙 INNER JOIN
。
使用 CROSS APPLY(SQL Server 2005 及更高版本)
CROSS APPLY
為外表中的每一行產生一個行集,從而啟用相關子查詢。 然後,該子查詢從相關表中過濾並選擇一行。
<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>
使用 INNER JOIN(SQL Server 2005 之前版本)
對於缺少 CROSS APPLY
的較舊 SQL Server 版本,帶有子查詢的 INNER JOIN
可得到相同的結果:
<code class="language-sql">SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description FROM Orders INNER JOIN LineItems ON LineItems.LineItemGUID = ( SELECT TOP 1 LineItemGUID FROM LineItems WHERE OrderID = Orders.OrderID )</code>
關於決定論的重要說明:
如果沒有 TOP 1
子句,ORDER BY
子句本質上是不確定的。 為了確保結果一致(即始終選擇 相同「第一個」行項目),請在內部查詢中加入 ORDER BY
子句(例如 ORDER BY LineItems.SomeColumn
)。 這確保了訂單項目的可預測選擇。
以上是如何在 SQL 中高效地僅連接到相關表的第一行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!