首頁 > 資料庫 > mysql教程 > 如何在 PostgreSQL 中有效率地從一個表中選擇另一個表中不存在的行?

如何在 PostgreSQL 中有效率地從一個表中選擇另一個表中不存在的行?

Linda Hamilton
發布: 2025-01-23 22:22:10
原創
651 人瀏覽過

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

擷取 PostgreSQL 中遺失的 IP 位址

本指南示範了幾種識別 PostgreSQL 資料庫中 login_log 表中存在但 ip_location 表中不存在的 IP 位址的方法。

方法一: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>
登入後複製

方法二: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>
登入後複製

方法三:EXCEPT

一種緊湊的方法,但對於複雜查詢不太靈活:

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

EXCEPT ALL  -- `ALL` preserves duplicates, potentially improving speed
SELECT ip
FROM   ip_location;</code>
登入後複製

方法四: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 JOINEXCEPT 通常提供卓越的性能。 確保兩個表的 ip 列上都有適當的索引,以獲得最佳結果。

以上是如何在 PostgreSQL 中有效率地從一個表中選擇另一個表中不存在的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板