ホームページ > データベース > mysql チュートリアル > SQL で関連テーブルの最初の行に効率的に結合するにはどうすればよいですか?

SQL で関連テーブルの最初の行に効率的に結合するにはどうすればよいですか?

DDD
リリース: 2025-01-17 06:18:09
オリジナル
593 人が閲覧しました

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

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート