Нужно иметь возможность проверять столбец один за другим и определенную строку, но не могу найти способ сделать это - PullRequest
0 голосов
/ 02 мая 2019

Таблицы Могу ли я иметь строку и проверять несколько столбцов в другой таблице по порядку, начиная с 1 до получения совпадения?

У меня есть таблица снесколько полей

 Medicine   
-----------
 Advil 
 Tylenol
 Midol

Мне нужно сравнить это с другой таблицей и проверить столбец для лекарства выше.

MedsToTry1  | MedsToTry2 | MedsToTry3 | MedsToTry4 | MedsToTry5 | MedsToTry6 |
------------|------------|------------|------------|------------|------------|
 NotAdvil      Advil        Null         Null         Null         Null
 Tylenol       Ibuprofen    NotTylenol   Null         Null         Null
 NotMidol      NotAdvil     Ibuprofen    Midol        Null         Null

Поэтому мне нужно пройти через каждое из полей в первой таблице и найти их в поле «MedsToTry1», если его там нет, то в «MedsToTry2» и так далее, пока не будет найдено.

Я пробовал объединение всех строк в полях MedsToTry и искал там строку, но это не гарантирует, что все будет в порядке, и мне нужно сначала проверить MedsToTry1,

Я попытался использовать COALESCE, но он возвращает поля в MedsToTry1, поскольку все они не равны NULL, но не пойдут в MedsToTry2, чтобы проверить, есть ли он там.

Есть ли способ для меня это сделать?У вас есть строка и проверка в нескольких столбцах другой таблицы, начиная с 1 до получения совпадения?

Если мне нужно предоставить дополнительную информацию, пожалуйста, сообщите мне.Я довольно новичок в SQL, поэтому я принимаю любую помощь, какую только могу.

Спасибо.

1 Ответ

0 голосов
/ 02 мая 2019

Ваша таблица - вполне вероятно, - не настоящая исходная таблица.Если вы можете сделать запрос против этого, это было намного лучше.Это - опять же мое предположение - результат операции 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
...