ホームページ > データベース > mysql チュートリアル > PostgreSQL で、あるテーブルから別のテーブルに存在しない行を効率的に選択する方法は?

PostgreSQL で、あるテーブルから別のテーブルに存在しない行を効率的に選択する方法は?

Linda Hamilton
リリース: 2025-01-23 22:22:10
オリジナル
650 人が閲覧しました

How to Efficiently Select Rows from One Table Not Present in Another in PostgreSQL?

PostgreSQL で欠落している IP アドレスを取得する

このガイドでは、PostgreSQL データベース内の login_log テーブルには存在するが、ip_location テーブルには存在しない IP アドレスを識別するためのいくつかの方法を示します。

方法 1: NOT EXISTS

一般に、PostgreSQL で最も効率的なアプローチと考えられています:

<code class="language-sql">SELECT ip 
FROM   login_log l 
WHERE  NOT EXISTS (
   SELECT 1 -- A simple SELECT is sufficient here
   FROM   ip_location
   WHERE  ip = l.ip
   );</code>
ログイン後にコピー

方法 2: LEFT JOIN/IS NULL

簡潔で多くの場合効率的な代替案:

<code class="language-sql">SELECT l.ip 
FROM   login_log l 
LEFT   JOIN ip_location i USING (ip) -- Equivalent to ON i.ip = l.ip
WHERE  i.ip IS NULL;</code>
ログイン後にコピー

方法 3: EXCEPT

コンパクトなメソッドですが、複雑なクエリには柔軟性が低くなります:

<code class="language-sql">SELECT ip 
FROM   login_log

EXCEPT ALL  -- `ALL` preserves duplicates, potentially improving speed
SELECT ip
FROM   ip_location;</code>
ログイン後にコピー

方法 4: NOT IN

NULL 値には潜在的な問題があるため、注意して使用してください:

<code class="language-sql">SELECT ip 
FROM   login_log
WHERE  ip NOT IN (
   SELECT DISTINCT ip  -- `DISTINCT` is optional
   FROM   ip_location
   );</code>
ログイン後にコピー

パフォーマンスの最適化

クエリのパフォーマンスは、データ量とテーブルのインデックス作成によって異なります。 通常、NOT EXISTSLEFT JOIN、および EXCEPT は優れたパフォーマンスを提供します。 最適な結果を得るには、両方のテーブルの ip 列に適切なインデックスが配置されていることを確認してください。

以上がPostgreSQL で、あるテーブルから別のテーブルに存在しない行を効率的に選択する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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