首页 > 数据库 > mysql教程 > 如何在 PostgreSQL 中高效地从一个表中选择另一个表中不存在的行?

如何在 PostgreSQL 中高效地从一个表中选择另一个表中不存在的行?

Linda Hamilton
发布: 2025-01-23 22:22:10
原创
649 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板