Могу ли я заполнить переменную «in», используя список значений, хранящихся в одном поле - PullRequest
0 голосов
/ 05 декабря 2018

Надеюсь, я не пытаюсь сделать то, что невозможно...

В моей БД приведенный ниже запрос работает и получает нужные значения.

select LabelID, Amount 
  from tCASpreadsData
 where LabelID in (3,4,5,7,9,10,11,12,16,17,18,19,21,22,23,24,28,29,30)

Однако я не хочу каждый раз составлять список LabelID вручную.У меня также нет способа логически выбрать их.Итак, я создал таблицу со всеми значениями, перечисленными в одном поле.

Приведенный ниже запрос находит нужный мне список в поле с именем SumA.

select SumA from tlCECLRatio where CATemplateID = 1 and LabelID = 148

(3,4,5,7,9,10,11,12,16,17,18,19,21,22,23,24,28,29,30)

Однако, когда я объединяю два запроса, я ничего не получаю.

SELECT LabelID, Amount 
  FROM tCASpreadsData 
 WHERE convert(nvarchar(255),LabelID) in 
       (Select SumA from tlCECLRatio where CATemplateID = 1 and LabelID = 148) 

Как я могу использовать значение SumA для создания списка «in» в предложении where?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Это будет работать:

select LabelID, Amount 
from tCASpreadsData 
where LabelID in ( 
    select SumA 
    from tlCECLRatio
    where CATemplateID = 1 and LabelID = 148
)
0 голосов
/ 06 декабря 2018

Из вашего OP кажется, что у вас есть свобода определять временную таблицу (tlCECLRatio) так, как вам нравится.Итак, я хотел бы предложить вам определить его без поля varchar и вместо этого использовать все целочисленные поля.Вот как это будет выглядеть с указанными вами значениями:

CATemplateID LabelID
           1       3
           1       4
           1       5
           1       7
           1       9
           1      10
           1      11
           1      12
           1      16
           1      17
           1      18
           1      19
           1      21
           1      22
           1      23
           1      24
           1      28
           1      29
           1      30

Если вам нужны другие коллекции этикеток, вы дадите им новый идентификатор шаблона.Поэтому каждая коллекция определяется значением CATemplateID.

Чтобы запросить нужные значения, это простое объединение.

select SD.LabelID, SD.Amount 
  from tCASpreadsData SD inner join tlCECLRatio CR
                         on SD.LabelID = CR.LabelID
 where CR.CATemplateID = 1

Примечание на стороне: Меня учили, что промежуточной таблице также нужен собственный идентификатор строки, поэтому я, вероятно, определил бы его как CECLRatioValue (RatioValueID, CATemplateID, LabelID), где RatioValueID - это значение последовательности (или автономного номера).Но это может быть излишним для простой таблицы перекрестных ссылок.Просто указав на то, что было рекомендовано мне как хорошая практика работы с базами данных.

0 голосов
/ 05 декабря 2018

вы можете попробовать, как показано ниже без необходимости преобразования

SELECT LabelID, Amount FROM tCASpreadsData where LabelID in
(
 Select SumA from tlCECLRatio where CATemplateID = 1 and LabelID = 148
)
...