「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > あるテーブルから別のテーブルに存在しない行を効率的に選択するにはどうすればよいですか?

あるテーブルから別のテーブルに存在しない行を効率的に選択するにはどうすればよいですか?

2024 年 11 月 3 日に公開
ブラウズ:498

 How Can I Efficiently Select Rows from One Table That Don\'t Exist in Another?

「NOT IN」テーブルを使用した SQL クエリの最適化

SQL では、あるテーブルには存在するが別のテーブルには存在しない行を選択するには、「NOT IN」を使用します。オペレーター。ただし、このアプローチでは、大規模なデータセットのパフォーマンスの問題が発生することがあります。

同じ主キーを持つ 2 つのテーブル A と B があるシナリオを考えてみましょう。 A から B に存在しないすべての行を選択するには、次のクエリを使用できます:

SELECT *
FROM A
WHERE NOT EXISTS (
  SELECT *
  FROM B
  WHERE A.pk = B.pk
);

このクエリは機能しますが、特に大きなテーブルの場合は非効率になる可能性があります。データベースは、A の各行に対してネストされたクエリを実行し、B 内の行の存在を確認する必要があります。

より良い方法は、左結合を使用し、NULL 値に基づいて結果をフィルタリングすることです。この方法では、A と B を共通の列で結合し、B の対応する列が null である行を A から選択します:

SELECT A.*
FROM A
LEFT JOIN B
ON A.x = B.y
WHERE B.y IS NULL;

このクエリは、単一の結合操作を実行し、B に値がないことに基づいて結果をフィルター処理します。通常、大規模なデータセットの場合は、「NOT IN」アプローチより高速です。

また、WHERE 句でサブクエリを使用することもできます:

SELECT A.*    
FROM A
WHERE x NOT IN (
  SELECT y
  FROM B
);

このアプローチは、大規模なデータセットでも優れたパフォーマンスを提供できます。

最終的に、クエリを最適化する最適な方法は、特定のデータとデータベース構成によって異なります。さまざまなアプローチをテストし、クエリに最適なパフォーマンスを提供するアプローチを選択することをお勧めします。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3