SQL の関連テーブルから最初の行のみを選択する
多くのデータセットには、関連テーブルからの複数のエントリを含む行が含まれています。 これらのテーブルを効率的に結合するには、データの重複を回避する戦略が必要です。この記事では、メイン テーブルの各エントリについて、関連テーブルの最初の行のみを結合する方法を説明します。
課題: 重複結合の回避
関連テーブルに 1 つの注文 ID に対して複数のエントリがある場合、単純な結合により注文ごとに複数の行が生成される可能性があります。最初の関連する行のみを選択するメソッドが必要です。
非効果的なアプローチ: TOP 1
の落とし穴
内部選択内で TOP 1
を使用する単純な試みは失敗します。これは、内部クエリが外部テーブルの列 (OrderID
など) にアクセスできないためです。
効果的な解決策: 2 つの実績のある方法
2 つの信頼できる方法により、望ましい結果が得られます。
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 中国語 Web サイトの他の関連記事を参照してください。