Я думаю, что я бы разработал базу данных другим способом, с одной таблицей TA, которая будет (MSGID, Key, CTID, Message), и еще одним TB, который будет хранить (MSGID, ID, IDTYPE), где ID будет представлять CampID / DistId / DefaultId (указывается IDTYPE), PK которого должен быть (ID, IDTYPE, MSGID) в этом порядке. Вы можете присвоить IDTYPE числовое значение, обозначающее приоритет, с 0 по умолчанию (и совпадающим идентификатором 0). Все столбцы НЕ НУЛЬЫ.
Если я хорошо понимаю вашу проблему, ваш ввод состоит из трех значений x, y и z (плюс неявный 0 в моем случае), вы хотите вернуть сообщение, для которого у вас больше всего совпадений, и, в случае, если равенства, порядок по IDTYPE.
select MSGID, count(*) as nbr_candidates, max(IDTYPE) as priority
from TB
where (ID = x and IDTYPE = ...)
or (ID = y and IDTYPE = ...)
or (ID = z and IDTYPE = ...)
or (ID = 0 and IDTYPE = 0)
group by MSGID
order by 2 desc, 3 desc
должен вернуть «лучшее сообщение» в качестве первой строки, и все, что вам нужно добавить, это
top 1
затем присоединитесь к другой таблице. Вероятно, это будет быстрее, чем решение с одной таблицей, поскольку таблица TB содержит только числовые идентификаторы и будет довольно компактной, а объединение будет мгновенным.