提问人:stUrb 提问时间:10/14/2013 最后编辑:Radek PostołowiczstUrb 更新时间:2/15/2023 访问量:276274
选择其他表中不存在的行
Select rows which are not present in other table
问:
我有两个postgresql表:
table name column names
----------- ------------------------
login_log ip | etc.
ip_location ip | location | hostname | etc.
我想从中获取每个没有行的 IP 地址。
我尝试了这个查询,但它抛出了一个语法错误。login_log
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`
我还想知道这个查询(经过调整以使其工作)是否是用于此目的的最佳查询。
答:
A.)该命令不存在,您缺少“S”。
B.)请改用 NOT IN
SELECT ip
FROM login_log
WHERE ip NOT IN (
SELECT ip
FROM ip_location
)
;
评论
此任务基本上有 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
有时这是最快的。通常最短。通常生成与 相同的查询计划。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
只有没有价值观或你知道正确处理的好。我不会将它用于此目的。此外,使用更大的表时,性能可能会下降。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 类似问题:
评论
LEFT JOIN
WHERE i.ip IS NULL
这也可以尝试...
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
评论
WHERE ip_location.ip is null
- 条件怎么可能是真的?此外,子查询不是相关的。WHERE
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 表中不存在的数据。(甚至我在里面给出了一些条件,你也可以给出。指定检索数据时不应存在的条件应放在括号内。
评论