Вы можете использовать аналитические подсчеты, чтобы увидеть, сколько характеристик имеет каждый объект, и сколько из них вы ищете; и затем сравните эти цифры:
select obj, obj_characteristic, characteristic_date_added
from (
select obj, obj_characteristic, characteristic_date_added,
count(distinct obj_characteristic) over (partition by obj) as c1,
count(distinct case when obj_characteristic in (1,2) then obj_characteristic end)
over (partition by obj) as c2
from your_table
)
where c1 = c2;
С вашими образцами данных, которые дают:
OBJ OBJ_CHARACTERISTIC CHARACTERI
------- ------------------ ----------
Mark 1 2018-01-15
Mark 2 2018-02-15
Michael 1 2018-06-15
Michael 2 2018-07-15
Судя по тому, как сформулирован вопрос, звучит так, будто вам нужны полные строки, как указано выше; Froma комментарий вы можете только имена. Если это так, вы можете просто изменить внешний выбор на:
select distinct obj
from ...
OBJ
-------
Mark
Michael
или используйте агрегаты вместо этого с помощью предложения having
:
select obj
from your_table
group by obj
having count(distinct obj_characteristic)
= count(distinct case when obj_characteristic in (1,2) then obj_characteristic end);
OBJ
-------
Mark
Michael
ДБ <> Скрипт демо из всех трех .
В этом случае, так как 1 и 2 являются смежными, вы также можете сделать это с min / max, как совокупность, чтобы просто получить имена:
select obj
from your_table
group by obj
having min (obj_characteristic) = 1
and max(obj_characteristic) = 2;
или аналитически для получения полных строк:
select obj, obj_characteristic, characteristic_date_added
from (
select obj, obj_characteristic, characteristic_date_added,
min(obj_characteristic) over (partition by obj) as min_char,
max(obj_characteristic) over (partition by obj) as max_char
from your_table
)
where min_char = 1
and max_char = 2;
но более ранние версии являются более общими.