У меня есть две таблицы Document и Label (не мой реальный случай, я использую аналогию). Один документ может иметь N меток. Когда мне нужно выбрать документы с перечисленными метками, я могу легко сделать это
select D.id from document D
join label L on D.id = L.document_id
where L.value in('label1','label2',...)
Как написать запрос, где мне нужны документы, которые НЕ имеют перечисленных меток? Когда я делаю это
select D.id from document D
join label L on D.id = L.document_id
where L.value not in('label1','label2',...)
тогда это не работает. Все документы, имеющие более одной метки, где одна из этих меток находится в списке, будут возвращены в любом случае. Потому что необработанные данные с комбинацией документа и этих оставшихся меток (не перечисленных меток) будут просто соответствовать условию where, поэтому запрос будет возвращать документы, которые я не хочу возвращать.
На самом деле я работаю над таким запросом в типизированных запросах Java Spring JPA. Мне нужно решить этот случай для моей системы фильтрации. Но я думаю, что лучше сначала решить эту проблему на уровне SQL.
Кстати, мы можем заменить «не в» на «!=» для простоты. Проблема все та же.
Любая идея для простого решения? заранее спасибо