当前位置: 首页 > 面试题库 >

选择其他表中不存在的行

谷涵容
2023-03-14
问题内容

我有两个postgresql表:

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

我想获取login_log其中没有一行的每个IP地址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](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.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](https://www.postgresql.org/docs/current/functions-

subquery.html#FUNCTIONS-SUBQUERY-NOTIN)

只有没有NULL价值或知道如何NULL正确处理才行。我 不会
将其用于此目的。
此外,更大的表可能会降低性能。

SELECT ip 
FROM   login_log
WHERE  ip NOT IN (
   SELECT DISTINCT ip  -- DISTINCT is optional
   FROM   ip_location
   );


 类似资料:
  • 我有两个postgresql表: 我想从登录日志中获取每个IP地址,它在IP\U位置中没有一行 我尝试了此查询,但它引发了语法错误。 我还想知道这个查询(通过调整使其工作)是否是用于此目的的性能最好的查询。

  • 问题内容: 我有一张桌子和一张桌子。向用户显示随机的其他用户数据,并可以决定他喜欢还是不喜欢它。我正在为尚未评级的代理用户选择新的随机用户合作伙伴! 现在,我试图选择表中没有行的所有用户,并将执行用户与已评级用户的关系评级。 该表是一个标准的用户表,在我的列,,,和。 我正在使用Laravel Eloquent,但也可以使用原始sql。 我的尝试: 这是错误的,因为通过此尝试我没有选择任何新用户。

  • 问题内容: 我有一个关于ORACLE的问题,我写了一个PLSQL CODE来检查一个表是否存在,如果存在,那么我从该表中选择一些东西。 如果(表存在)从表中选择…。 问题是,即使表条件不存在且select语句从不执行,即使表不存在,我也总是会收到错误消息。 我认为这是因为在编译时检查了我的代码:“ select from ..”,如果表不存在,则会打印错误。我该如何解决这样的问题?..这是我的代码

  • 我有两个问题: 从表1中选择*,其中my\u值介于值1和值2之间 从表2中选择值1、值2 表2中的value1和value2的集合是唯一的。如何在第一个查询的where语句中插入查询2的所有结果集?

  • 问题内容: 具有下表(): 另一个帮助表(): 我正在寻找一个SQL查询来输出以下内容: 所以,每一次是和是 在 响应表, 汇总 对话上下文到这一点,忽略不池中的响应结束谈话的一部分。 在上面的示例中,活动 响应文本 为1中的 3 。 我尝试了以下复杂的SQL,但有时会中断将文本汇总错误的情况: 我敢肯定有更好的方法。 问题答案: 这是我的看法: 这将扫描表一次,但是我不确定它的性能是否会比您的解

  • 我有四张桌子A、B、C和D。 我需要选择值2(我从表D中猜测),其中值1和值3在表D中的同一行中,并且在表A和表C的行中都有相同的“城市”。 所以,如果表A有一行 表C有行 表D有行 然后我需要打印: