У меня есть две таблицы 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`
Мне также интересно, является ли этот запрос (с изменениями, чтобы он работал) наиболее эффективным для этой цели.
LEFT JOIN
- если в таблице поиска есть несколько совпадающих строк, это создаст дублирующую запись в вашем основном запросе для каждой совпадающей строки, которая может быть нежелательной.WHERE i.ip IS NULL
, что означает отсутствие совпадения.A.) Команда НЕ СУЩЕСТВУЕТ, вам не хватает буквы «S».
B.) Вместо этого используйте NOT IN
источник
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 содержит все данные, а таблица выполнения - содержит некоторые данные из таблицы testcases1. Я получаю только данные, которых нет в таблице exections1. (и даже я даю некоторые условия внутри, которые вы также можете задать.) Укажите условие, которого не должно быть при извлечении данных, должно быть в скобках.
источник
это тоже можно попробовать ...
источник
WHERE ip_location.ip is null
- какWHERE
условие может быть когда-либо истинным? Кроме того, подзапрос не является коррелированным.