当前位置: 首页 > 知识库问答 >
问题:

选择其他表中不存在的行

谢鸿
2023-03-14

我有两个postgresql表:

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

我想从登录日志中获取每个IP地址,它在IP\U位置中没有一行
我尝试了此查询,但它引发了语法错误。

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`

我还想知道这个查询(通过调整使其工作)是否是用于此目的的性能最好的查询。

共有3个答案

阎建德
2023-03-14

这里testcases1表包含所有数据,并且执行1表包含testcases1表中的一些数据。我只检索执行1表中不存在的数据。(甚至我在里面给出了一些你也可以给出的条件。)指定检索数据时不应该存在的条件应该在括号内。

辛锦
2023-03-14

A.)命令不存在,您缺少“S”。

B、 )改用NOT IN

SELECT ip 
  FROM login_log 
  WHERE ip NOT IN (
    SELECT ip
    FROM ip_location
  )
;
曾元忠
2023-03-14

此任务基本上有4种技术,都是标准SQL。

通常在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
   );

还要考虑:

  • 在EXISTS子查询中什么更容易读取

有时这是最快的。通常最短。通常会导致与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;

请注意(根据文件):

除非使用EXCEPT ALL,否则将消除重复项。

通常,您需要使用ALL关键字。如果你不在乎,仍然使用它,因为它可以使查询更快。

只有在没有NULL值或您知道正确处理NULL的情况下才好。我不会为此目的使用它。此外,更大的表可能会降低性能。

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

不在中时,两边的值都带有一个“陷阱”:

  • 查找不存在联接的记录

关于dba的类似问题。针对MySQL的SE:

  • 选择第一列中不存在第二列值的行
 类似资料:
  • 问题内容: 我有两个postgresql表: 我想获取其中没有一行的每个IP地址。 我尝试了此查询,但它引发了语法错误。 我也想知道此查询(进行调整以使其工作)是否是为此目的性能最佳的查询。 问题答案: 基本上有4种技术可以完成此任务,所有这些技术都是标准SQL。 在Postgres中通常最快。 [](https://www.postgresql.org/docs/current/queries-

  • 问题内容: 我有一张桌子和一张桌子。向用户显示随机的其他用户数据,并可以决定他喜欢还是不喜欢它。我正在为尚未评级的代理用户选择新的随机用户合作伙伴! 现在,我试图选择表中没有行的所有用户,并将执行用户与已评级用户的关系评级。 该表是一个标准的用户表,在我的列,,,和。 我正在使用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有行 然后我需要打印: