[解決済み】他のテーブルに存在しない行を選択する
2022-04-11 11:42:33
質問
Postgresqlのテーブルを2つ持っています。
table name column names
----------- ------------------------
login_log ip | etc.
ip_location ip | location | hostname | etc.
からすべてのIPアドレスを取得したい。
login_log
に行がない場合、その行は
ip_location
.
このクエリを試しましたが、シンタックスエラーが投げられました。
SELECT login_log.ip
FROM login_log
WHERE NOT EXIST (SELECT ip_location.ip
FROM ip_location
WHERE login_log.ip = ip_location.ip)
<ブロッククオート
ERROR: syntax error at or near "SELECT"
LINE 3: WHERE NOT EXIST (SELECT ip_location.ip`
また、このクエリ(うまくいくように調整したもの)が、この目的のために最もパフォーマンスの高いクエリであるかどうかも気になるところです。
どのように解決するのですか?
このタスクには基本的に4つのテクニックがあり、いずれも標準SQLです。
NOT EXISTS
Postgresで最速となることが多い。
SELECT ip
FROM login_log l
WHERE NOT EXISTS (
SELECT -- SELECT list mostly irrelevant; can just be empty in Postgres
FROM ip_location
WHERE ip = l.ip
);
も検討してください。
LEFT JOIN / IS NULL
これが最速の場合もある。最短であることも多い と同じクエリプランになることがよくあります。
NOT EXISTS
.
SELECT l.ip
FROM login_log l
LEFT JOIN ip_location i USING (ip) -- short for: ON i.ip = l.ip
WHERE i.ip IS NULL;
EXCEPT
短い。より複雑なクエリに簡単に統合できない。
SELECT ip
FROM login_log
EXCEPT ALL -- "ALL" keeps duplicates and makes it faster
SELECT ip
FROM ip_location;
ただし、( ドキュメントにつき ):
がない限り、重複は排除されます。
EXCEPT ALL
が使用されます。
一般的には
ALL
というキーワードがあります。クエリになるため、気にしない場合はそのまま使用します。
より速く
.
NOT IN
がない場合のみ有効
NULL
を処理することを知っている場合、または
NULL
を適切に設定します。
私なら
ない
に使用してください。
また、テーブルが大きくなるとパフォーマンスが低下することがあります。
SELECT ip
FROM login_log
WHERE ip NOT IN (
SELECT DISTINCT ip -- DISTINCT is optional
FROM ip_location
);
NOT IN
を運ぶ罠。
NULL
の値を左右に表示します。
MySQL を対象とした dba.SE での同様の質問。
関連
-
[解決済み】一括読み込みデータ変換エラー(切り捨て)
-
[解決済み] INSERT ステートメントが FOREIGN KEY 制約と競合する - SQL Server
-
[解決済み] pg_restoreです。[archiver] 入力ファイルはテキスト形式のダンプであるように見えます。psql を使用してください。
-
[解決済み] SQLです。最初の出現箇所のみを返す
-
[解決済み] Oracle Trigger ORA-04098: トリガーが無効で、再バリデーションに失敗しました。
-
[解決済み] PostgreSQLで重複して更新された場合の挿入?
-
[解決済み] SQL Server テーブルからランダムな n 行を選択する
-
[解決済み】MySQL LEFT JOINで行を削除する。
-
[解決済み】PostgresqlデータベースでNULLを許可しないカラムを追加するにはどうすればよいですか?
-
[解決済み] SQL select join: すべてのカラムに 'prefix.*' というプレフィックスを付けることは可能ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】''付近の構文が正しくない
-
[解決済み] テーブルのFROM句の項目がない [終了しました] 。
-
[解決済み】2つの列を分割する方法は?
-
[解決済み】集約関数のないTSQLピボット
-
[解決済み] INSERT ステートメントが FOREIGN KEY 制約と競合する - SQL Server
-
[解決済み] 2つの列を分割するには?
-
[解決済み] 列名または提供された値の数がテーブル定義と一致しません。
-
[解決済み] nvarchar 値 ... をデータ型 int に変換する際に、変換に失敗しました。
-
[解決済み] MySQLのON句の不明なカラム
-
[解決済み] SQLiteでどのようにピボットするか、つまり、長い形式で保存されたテーブルを広い形式で選択するか?