#database #sqlite
#База данных #sqlite
Вопрос:
У меня есть следующие таблицы:
CREATE TABLE ips(
ip TEXT PRIMARY KEY,
blocked INTEGER(1) DEFAULT 0
);
CREATE TABLE acc(
ip TEXT NOT NULL,
time INTEGER(4) DEFAULT (CAST(strftime('%s','now') AS INT)),
FOREIGN KEY(ip) REFERENCES ips(ip) ON DELETE CASCADE
);
Как я могу получить список IP-адресов из первой таблицы, которые имеют blocked = 1
и 0 связанных строк в таблицах «acc»?
SELECT ip FROM ips WHERE blocked = 1 AND ...
Ответ №1:
вы можете использовать левое внешнее соединение.
пример: выберите * из ip-адресов левое внешнее соединение acc b на a.ip =b.ip, где a.blocked = 0 и b.ip равно нулю
Ответ №2:
Вы можете использовать NOT EXISTS
:
select i.* from ips i
where i.blocked = 1
and not exists (select 1 from acc a where a.ip = i.ip)
или, если вам нужен только столбец, ip
используйте EXCEPT
:
select ip from ips where blocked = 1
except
select ip from acc