SQL 結合を最初の関連行に制限する
SQL で複数のテーブルを効率的に結合することは非常に重要ですが、場合によっては、関連テーブルの最初の行だけが必要な場合もあります。この記事では、1 対多のリレーションシップを扱うときに結合を 1 つの行に制限し、重複する行を回避する方法を説明します。
一般的なシナリオを調べてみましょう:
Orders
と LineItems
という 2 つのテーブルがあります。 ほとんどの注文には 1 つの品目がありますが、一部の注文には複数の品目がある場合があります。 複数の明細項目が存在する場合、標準の INNER JOIN
では注文行が重複します。
これを防ぐために、結合を注文ごとに最初の LineItems
行のみに制限します。 ここでは 2 つの効果的な方法を紹介します:
CROSS APPLY の使用 (SQL Server 2005 以降):
このアプローチは、よりクリーンで読みやすいソリューションを提供します。
<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>
サブクエリによる内部結合の使用 (SQL Server 2005 以前):
古い SQL Server バージョンの場合、この方法でも同じ結果が得られます。
<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
ORDER BY
は、非決定的な結果を生成します。特定の行を一貫して選択するには、内部クエリに常に ORDER BY
句を含めて、必要な並べ替え基準を指定します。
以上がSQL 結合を関連テーブルの最初の行のみに制限するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。