Найти все объекты, где все значения их атрибутов находятся в пределах значений атрибутов другого объекта

#sql #sql-server #join

#sql #sql-сервер #Присоединиться

Вопрос:

Рассмотрим следующую таблицу:

 partyId PartyName   AttributeId
------- ----------  -----------
200167  Customer1   6444
200167  Customer1   6443
200167  Customer1   6442
200112  Customer2   6443
200133  Customer3   6443
200133  Customer3   6442
200155  Customer4   6449
200155  Customer4   6442
  

У Customer1 есть набор атрибутов, связанных с ним. Я буду ссылаться на это как на набор атрибутов Customer1. Клиенты 2 и 3 имеют наборы атрибутов, которые полностью входят в набор атрибутов Customer1. Однако у клиента 4 есть один из его атрибутов, которого нет в наборе атрибутов Customer1 (AttributeID 6449). Я пытаюсь написать SQL-запрос, который выдаст отдельный список сторон, где весь набор атрибутов участника находится в наборе атрибутов customer1, и это исключает всех клиентов, весь набор которых не входит в набор атрибутов customer1. В этом примере результат должен быть:

 partyId PartyName  
------- ----------  
200112  Customer2
200133  Customer3
  

Ответ №1:

Следующее использует агрегирование и подсчитывает количество атрибутов для данного клиента, которые соответствуют клиенту 1:

 select t.customerid
from t left join
     t t1
     on t1.attributeid = t.attributeid and
        t1.customerid = 'Customer1'
group by t.customerid
having count(t.customerid) = count(t1.customerid);
  

Комментарии:

1. Спасибо, Гордон. Именно то, что мне было нужно!