postgresql 选择其他表中不存在的行

biswetbf  于 2023-02-15  发布在  PostgreSQL
关注(0)|答案(4)|浏览(168)

我有两个postgresql表:

table name     column names
-----------    ------------------------
login_log      ip | etc.
ip_location    ip | location | hostname | etc.

我想从login_log中获取在ip_location中没有行的每个IP地址。
我尝试了这个查询,但它抛出了一个语法错误。
x一个一个一个一个x一个一个二个x
我还想知道这个查询(经过调整使其工作)是否是用于此目的的性能最好的查询。

btqmn9zl

btqmn9zl1#

基本上有4种技术可以完成这项任务,它们都是标准SQL。
∮ ∮ ∮ ∮ ∮一个月一个月
通常在波斯格雷最快。

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
   );

还应考虑:

一米一分一秒

有时这是最快的,通常是最短的,通常会产生与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;

短。不容易集成到更复杂的查询中。

SELECT ip 
FROM   login_log

EXCEPT ALL  -- "ALL" keeps duplicates and makes it faster
SELECT ip
FROM   ip_location;

注意(per documentation):
除非使用EXCEPT ALL,否则消除重复。
通常情况下,您需要使用ALL关键字,如果您不在乎,仍然使用它,因为它使查询 * 更快
∮ ∮ ∮ ∮ ∮一米六一分
只有在没有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上的类似问题:

zfciruhq

zfciruhq2#

A.)命令是NOT EXISTS,您缺少“S”。
B.)使用NOT IN代替

SELECT ip 
  FROM login_log 
  WHERE ip NOT IN (
    SELECT ip
    FROM ip_location
  )
;
js81xvg6

js81xvg63#

SELECT * FROM testcases1 t WHERE NOT EXISTS ( SELECT 1 FROM executions1 i WHERE t.tc_id = i.tc_id and t.pro_id=i.pro_id and pro_id=7 and version_id=5 ) and pro_id=7 ;
这里testcases1表包含所有数据和executions1表包含testcases1表中的一些数据。我只检索exections1表中不存在的数据。(甚至我给出了一些条件,你也可以给予。)指定检索数据时不应该存在的条件应该放在括号内。

qltillow

qltillow4#

这个也可以试试......

SELECT l.ip, tbl2.ip as ip2, tbl2.hostname
FROM   login_log l 
LEFT   JOIN (SELECT ip_location.ip, ip_location.hostname
             FROM ip_location
             WHERE ip_location.ip is null)tbl2

相关问题