複数品目結合での注文番号の重複を避ける
注文ごとに複数の品目を持つテーブルが関与するデータベース結合では、結果に注文番号が重複することがよくあります。 この記事では、一意の注文ごとに 1 つのレコードのみを取得する効率的なソリューションについて説明します。
初期のアプローチとその欠点
簡単なアプローチとしては、「TOP 1」の広告申込情報のみを選択することが考えられます。 ただし、これは、内部の select ステートメント内から外部テーブルに直接アクセスする際の制限により失敗します。
効率的な解決策: クロス適用
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>
CROSS APPLY
は、各注文の最初の品目を効率的に取得し、注文番号の重複を防ぎます。
古い SQL Server バージョンの代替: INNER JOIN
2005 より前の 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
節のない ORDER BY
は非決定的です。 選択された行項目は、データが変更されていない場合でも、クエリの実行ごとに異なる場合があります。 一貫した結果を保証するために、内部クエリ内には常に ORDER BY
句を含めてください。
以上が複数の明細を含むテーブルを結合するときに重複する注文番号を削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。