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

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

DDD
DDD原創
2025-01-17 06:18:09600瀏覽

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

在 SQL 中只選取相關表格中的第一行

許多資料集包含包含相關表中多個條目的行。 有效地連接這些表需要一種避免資料重複的策略。本文示範如何僅連接主表中每個條目的相關表格的第一行。

挑戰:避免重複連接

如果相關表格具有單一訂單 ID 的多個條目,則簡單的聯結可能會為每個訂單產生多行。我們需要一種方法來只選擇第一個相關行。

無效的方法:TOP 1陷阱

在內部選擇中使用 TOP 1 的天真嘗試會失敗,因為內部查詢無法存取外部表的列(如 OrderID)。

有效的解:兩種行之有效的方法

兩種可靠的方法達到了預期的效果:

1。 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>

2。 INNER JOIN(針對 2005 年之前的 SQL Server 版本):

對於較舊的 SQL Server 版本,帶有子查詢的 INNER JOIN 可以實現相同的結果:

<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
)</code>

兩種方法都利用 TOP 1LineItems 中只選擇第一個匹配行。 這消除了數據冗餘。

確保確定性結果

至關重要的是,如果內部 ORDER BY 語句中沒有 SELECT 子句,「第一」行是任意的。 即使資料相同,不同的查詢執行也可能傳回不同的結果。 始終在內部查詢中包含 ORDER BY 子句,以確保結果的一致性和可預測性。 例如:

<code class="language-sql">SELECT TOP 1 LineItems.Quantity, LineItems.Description
FROM LineItems
WHERE LineItems.OrderID = Orders.OrderID
ORDER BY LineItems.SomeColumn  -- Add a column to order by</code>

示範這些技術的 SQLfiddle 範例可用(省略鏈接,因為無法在此處建立即時 SQLfiddle 連結)。 請參閱線上資源以取得實際範例。

以上是如何在 SQL 中高效率地連接到相關表的第一行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn