Хотя я бы не рекомендовал это решение только для двух поисков переменных, темпы роста стоимости запросов при сопоставлении с большим количеством переменных увеличиваются очень медленно, а не при внутреннем соединении для каждого совпадения. Как заявление об отказе от ответственности, я понимаю, что, если труба является допустимым полем или есть кодированные в xml символы, это прерывание.
select e.bid
from myTable e
cross apply ( select '|'+ i.data + '|'
from myTable i
where e.bid = i.bid
for xml path('')) T(v)
where v like '%|A|%' and v like '%|B|%' --and v like '%|C|%'.....
group by e.bid
как сторона, не касающаяся других вариантов, ваш ответ может быть упрощен до
select bid from my_table as t1 where
exists (select * from my_table t2 where
t2.bid = t1.bid and
t2.data='a'
)
and t1.data = 'c'
group by bid;
Это примерно эквивалент ответа Кристиана. Оптимизатор, скорее всего, будет относиться к ним одинаково.
select distinct t1.bid
from table_1 t1
inner join table_1 t2 on t1.bid = t2.bid
where t1.data = 'a' and t2.data = 'c'