在 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 1
從 LineItems
中只選擇第一個匹配行。 這消除了數據冗餘。
確保確定性結果
至關重要的是,如果內部 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中文網其他相關文章!