Ваша таблица - вполне вероятно, - не настоящая исходная таблица.Если вы можете сделать запрос против этого, это было намного лучше.Это - опять же мое предположение - результат операции pivot , где таблица по строкам преобразуется в рядом или по столбцам формат.
Вы не указали ожидаемый результат.В следующий раз или для улучшения этого вопроса, пожалуйста, посмотрите мой код и попробуйте подготовить автономный пример для воспроизведения вашей проблемы самостоятельно.На этот раз я сделал это для вас:
Сначала мы должны объявить таблицы макетов для имитации вашей проблемы:
DECLARE @tblA TABLE(Medicine VARCHAR(100));
INSERT INTO @tblA VALUES
('Advil')
,('Tylenol')
,('Midol');
DECLARE @tblB TABLE(RowId INT,MedsToTry1 VARCHAR(100),MedsToTry2 VARCHAR(100),MedsToTry3 VARCHAR(100),MedsToTry4 VARCHAR(100),MedsToTry5 VARCHAR(100),MedsToTry6 VARCHAR(100));
INSERT INTO @tblB VALUES
(1,'NotAdvil','Advil',Null,Null ,Null,Null)
,(2,'Tylenol','Ibuprofen','NotTylenol',Null ,Null,Null)
,(3,'NotMidol','NotAdvil','Ibuprofen','Midol',Null,Null);
- это запрос(используйте собственные имена таблиц, чтобы проверить это в своей среде)
SELECT B.RowId
,C.*
FROM @tblB b
CROSS APPLY (VALUES(1,b.MedsToTry1)
,(2,b.MedsToTry2)
,(3,b.MedsToTry3)
,(4,b.MedsToTry4)
,(5,b.MedsToTry5)
,(6,b.MedsToTry6)) C(MedRank,Medicin)
WHERE EXISTS(SELECT 1 FROM @tblA A WHERE A.Medicine=C.Medicin);
Идея вкратце:
Трюк с CROSS APPLY (VALUES...
будет возвращать каждый имя с номером столбец (MedsToTry1, MedsToTry2 ...) в один ряд вместе с рангом.Таким образом, мы не теряем информацию о порядке сортировки или позиции в таблице.
WHERE
уменьшит набор до строк, где в другой таблице существует соответствующее лекарство.
Результат
RowId MedRank Medicin
1 2 Advil
2 1 Tylenol
3 4 Midol