У меня есть таблица с:
sqlite> select * from lookup;
node|id
1|1
1|2
2|4
2|6
sqlite> select * from tag;
tagid|data
1|bar
2|baz
3|geek
4|foo
5|bank
6|auto
Я хотел бы найти идентификаторы в таблице тегов, которые не упоминаются в поиске. Я пробовал:
select id from tag where not exists (select tagid from lookup);
# I am expecting the following result: 3, 5
Но это ничего не возвращает. tagid
- это внешний ключ к tag
, может ли это быть источником проблемы? Подскажите, как это сделать в SQL?
2 ответа
Вам необходимо соотнести два запроса. Поскольку у вас есть это, вы просто спрашиваете, не существует ли ничего в таблице поиска.
select
id
from
tag t
where
not exists (
select
'x'
from
lookup l
where
l.tagid = t.id -- correlation
);
Вы также можете написать это, используя внешнее соединение
select
t.id
from
tag t
left outer join
lookup l
on t.id = l.tagid
where
l.tagid is null;
Некоторые базы данных имеют разные характеристики производительности для двух методов.
Удалить:
delete from
tag
where
not exists (
select
'x'
from
lookup l
where
l.tagid = tag.id
);
DELETE FROM TAG WHERE ID in (select id from tag t where not exists (select id from lookup l where l.tagid = t.id)
сработало.
Вы запрашиваете идентификаторы из таблицы тегов, но ваш выбор использует идентификаторы из таблицы поиска. Вы должны выбрать идентификаторы тегов из таблицы тегов, чтобы эти идентификаторы НЕ входили в набор идентификаторов из таблицы поиска:
select tagid from tag where tagid not in (select id from lookup);
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.
tagid
является внешним ключом дляtag
, почему он находится в той же таблице?