Столбец запроса SQL Server, содержащий список идентификаторов - PullRequest
0 голосов
/ 10 мая 2018

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

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

Псевдоишевой запрос:

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 (идент.), Имя региона, некоторые другие столбцы
  • branchoffices - boid (идент), rids, город, штат, почтовый индекс, некоторые другие столбцы

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

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

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

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

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

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

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

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

Ответы [ 2 ]

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

В дополнение к другому ответу, если вы ДЕЙСТВИТЕЛЬНО управляете базой данных, лучше создать структуру, которая будет хранить отношения между Region и BranchOffice в отдельной таблице для большей гибкости и лучшей производительности.

Таблицы:

CREATE TABLE Region (
    regionId int identity
    , regionname varchar(100)
)

CREATE TABLE BranchOffice (
    BranchOfficeId identity
    , city varchar(50)
    , state varchar(5)
    , phone varchar(50)
)

-- relationship between braches and regions
CREATE TABLE BranchOfficeRegion
(
    BranchOfficeId int
    , regionId int
)

Запрос:

SELECT  b.*
FROM    branchOffice b 
WHERE EXISTS (
    SELECT NULL
    FROM   BranchOfficeRegion br 
    WHERE  br.branchOfficeId = b.branchOfficeId
    AND    br.regionID IN ( 2,3,4 )
) 
0 голосов
/ 10 мая 2018

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

  • 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;
...