Самостоятельные объединения и другие способы доступа к таблице более одного раза будут работать, но могут снизить производительность и будут громоздкими, если вам нужно обобщить для больших наборов идентификаторов.
Вы можете сделать это с помощью одногоссылка на таблицу путем подсчета количества совпадающих строк на человека:
select personid from P
where licensetypeid in ('1','5')
group by personid
having count(*) = 2
Это может быть легко расширено, если вам требуется большее значение licensetypeid:
select personid from P
where licensetypeid in ('1','5','7')
group by personid
having count(*) = 3
(вСамостоятельная версия, вам нужно будет добавить дополнительное объединение для каждого дополнительного значения)
Или если вы хотите найти людей, которые имеют как минимум 2 типа из большего набора типов:
select personid from P
where licensetypeid in ('1','5', '7', '10')
group by personid
having count(*) >= 2
Теперь, в отличие от вашего примера запроса, тип лицензии не включается в набор результатов.Если это необходимо по какой-то причине, вы можете сделать простой трюк в случае 2 значений:
select personid, min(licensetypeid) licensetype1, max(licensetypeid) licensetype2
from P
where licensetypeid in ('1','5')
group by personid
having count(*) = 2
Но более общий подход заключается в группировке значений в простой набор:
select personid, collect(licensetypeid) licensetypeidlist
from P
where licensetypeid in ('1','5')
group by personid
having count(*) = 2