基本上有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
](https://www.postgresql.org/docs/current/queries-
table-expressions.html#QUERIES-FROM)
有时这是最快的。通常最短。通常会产生与相同的查询计划
NOT EXISTS。
SELECt l.ip FROM login_log l LEFT JOIN ip_location i USING (ip) -- short for: ON i.ip = l.ipWHERe i.ip IS NULL;
EXCEPT
短的。不那么容易集成到更复杂的查询中。
SELECt ip FROM login_logEXCEPT ALL -- "ALL" keeps duplicates and makes it fasterSELECt ipFROM ip_location;
请注意(根据文档):
除非
EXCEPT ALL使用,否则消除重复项。
通常,您会需要
ALL关键字。如果您不在乎,请继续使用它,因为它可以使查询 更快 。
[NOT IN
](https://www.postgresql.org/docs/current/functions-
subquery.html#FUNCTIONS-SUBQUERY-NOTIN)
只有没有
NULL价值或知道如何
NULL正确处理才行。我 不会
将其用于此目的。此外,更大的表可能会降低性能。
SELECt ip FROM login_logWHERe ip NOT IN ( SELECt DISTINCT ip -- DISTINCT is optional FROM ip_location );



