Столбец запроса SQL Server, содержащий список идентификаторов

Я, вероятно, слишком усложняю это, но я пытаюсь выполнить запрос, который возвращает записи, в которых один или несколько идентификаторов в списке (списке ридов) присутствуют в столбце, который также является списком идентификаторов (ридов).

Вероятно, есть гораздо более простой способ сделать это, но я новичок в этом и не могу понять это.

Псевдо-запрос:

select boid, rids, address, city, state, zip
from branchoffices
where rids contains one or more of the ids in ridlist

У меня есть филиалы, которые отвечают за разные регионы, и мне нужно иметь возможность перечислить все филиалы, которые занимаются деятельностью, в выбранном пользователем списке регионов.

Например:

branchoffice1's rid field in the db contains 1,13,22
branchoffice2's rid field contains 2,3,4

Если пользователь выбирает регионы 1 и 2, создается список 2,3. Я бы хотел, чтобы запрос возвращал только boid branchoffice2. Поэтому я не думаю, что использование % сработает.

Таблицы:

  • regions - rid(ident), имя региона, некоторые другие столбцы
  • branchoffices - boid(ident), rids, city, state, zip, некоторые другие столбцы

Пример данных:

Таблица регионов (рид, имя региона):

"1", "Dallas/Fort Worth"
"2", "Greater Houston"
"3", "Austin"
"4", "San Antonio"
"5", "San Marcos"
etc

Таблица филиалов (boid, rids, city, state, phone):

"1", "2,3", "Houston", "TX", "1231231234"
"2", "1", "Fort Worth", "TX", "4561231234"
"3", "4,5", "San Antonio", "TX", "7891231234"

Таким образом, в приведенном выше примере данных boid 1 (офис в Хьюстоне) отвечает за регионы Большого Хьюстона и Остина.

Надеюсь, это имеет смысл.

Большое спасибо за любую помощь, и я приношу свои извинения, если я уже пропустил это.


person Valerum Frost    schedule 10.05.2018    source источник
comment
Не храните данные, разделенные запятыми, в таблицах базы данных. Я мог бы задать вам вопрос, но это почти оказало бы вам медвежью услугу, потому что лучшее, что вы можете сделать, это исправить дизайн вашей таблицы. Храните каждый rid в отдельной строке.   -  person Tim Biegeleisen    schedule 10.05.2018
comment
Привет Тим, спасибо за ответ. я наверное не правильно понимаю. у меня есть таблица регионов со всеми поездками в отдельной строке. затем таблица филиалов с подробной информацией о каждом филиале, boid (идентификация) и поле rids (список идентификаторов, что, по-видимому, плохо, лол)   -  person Valerum Frost    schedule 10.05.2018
comment
Ваш вопрос не ясен. Пожалуйста, отредактируйте свой вопрос и покажите нам фактические образцы данных таблицы в табличной форме, отформатированные как код, с 4 или более начальными пробелами в каждой строке.   -  person Tim Biegeleisen    schedule 10.05.2018
comment
Кроме того... Я добавил для вас тег SQL Server. Пожалуйста, также добавьте тег для версии сервера sql, которую вы используете.   -  person Nick.McDermaid    schedule 10.05.2018
comment
мои извинения, это мой первый вопрос, я все еще изучаю интерфейс. спасибо за терпение.   -  person Valerum Frost    schedule 10.05.2018
comment
спасибо, ник, теперь я вижу, как это работает 8-)   -  person Valerum Frost    schedule 10.05.2018
comment
теперь там есть некоторые образцы данных, надеюсь, я сделал это правильно   -  person Valerum Frost    schedule 10.05.2018
comment
Вам было бы полезно прочитать о нормализации данных, особенно о первой нормальной форме (1NF). Ссылка хорошо объясняет, почему не рекомендуется помещать несколько разделенных запятыми rids в одно поле, а также пару способов правильной настройки таблиц.   -  person BobRodes    schedule 10.05.2018
comment
Большое спасибо всем вам! Я прочитаю эту ссылку BobRodes, спасибо!!   -  person Valerum Frost    schedule 10.05.2018


Ответы (1)


У вас должна быть отдельная таблица с одной строкой на ветку и на рид. Почему хранить идентификаторы в строке неправильно? Вот несколько причин:

  • rid является целым числом. Он должен храниться как целое число, а не как строка.
  • Столбец (по крайней мере, с использованием базовых типов столбцов) должен хранить только одно значение.
  • Внешние ключи должны быть правильно объявлены, и вы не можете сделать это, если значения имеют неправильный тип.
  • SQL Server имеет паршивые строковые функции (просто признайте это).
  • SQL Server не может очень хорошо оптимизировать запросы.
  • В SQL есть отличный способ хранения списков. Он называется таблицей, а не строкой.

Иногда вы застряли с очень, очень, очень плохим дизайном других людей. В SQL Server есть функция, которая может вам помочь, split_string(). Вы можете использовать его с боковым соединением:

select bo.*
from branchoffices bo cross apply
     (select ss.rid
      from split_string(bo.rids) ss(rid)
      where ss.rid in (1, 2, 3)
     ) ss;

Обратите внимание, что вы также можете использовать split_string() на входе использования:

with rids as (
      select rid
      from split_string('1,2,3') ss(rid)
     )
select bo.*
from branchoffices bo cross apply
     (select ss.rid
      from split_string(bo.rids) ss(rid) join
           rids
           on ss.rid = rids.rid
     ) ss;
person Gordon Linoff    schedule 10.05.2018
comment
Большое спасибо! когда я сдался прошлой ночью, в ту минуту, когда я сел в постели, я подумал про себя. Интересно, можно ли просто создать еще одну таблицу с этими отношениями id. Спасибо еще раз!! - person Valerum Frost; 10.05.2018