首頁 > 資料庫 > mysql教程 > 如何在 SQL 中高效地僅連接到相關表的第一行?

如何在 SQL 中高效地僅連接到相關表的第一行?

Barbara Streisand
發布: 2025-01-17 06:03:35
原創
858 人瀏覽過

How Can I Efficiently Join to Only the First Row of a Related Table in SQL?

在 SQL 連線中僅選擇相關表格中的第一行

資料庫連線通常會從相關表中檢索多個符合的行。 本文解決了即使存在多個符合項,您也需要將聯結限制為每個父記錄的單行的情況。 這可以防止查詢輸出中出現重複結果。

挑戰

考慮兩個表:OrdersLineItems。 通常,一份訂單有一個行項目,但有些訂單可能有多個行項目。 顯示訂單詳細資訊時,每個訂單僅顯示一個訂單項目至關重要,否則會導致結果重複混亂。

最初的方法(及其失敗)

在聯結中使用 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板