包含id列表的SQL Server查询列

时间:2018-05-10 05:39:17

标签: sql sql-server sql-server-2016 cfml lucee

我可能过于复杂了,但是我试图做一个返回记录的查询,其中一个列表中的一个或多个id(ridlist)出现在列中,列也是id(#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。我希望查询只返回branchoffice2的boid。所以我不认为使用像%这样的工作。

表:

  • regions - rid(ident),regionname,其他一些列
  • branchoffices - boid(ident),rids,city,state,zip,其他一些列

示例数据:

区域表(rid,regionname):

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

Branchoffices表(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(休斯顿办事处)负责大休斯顿和奥斯汀地区。

希望这是有道理的。

非常感谢您提供任何帮助,如果我错过了这项工作,我会道歉。

2 个答案:

答案 0 :(得分:1)

你应该有一个单独的表,每个分支和每个rid一行。为什么在字符串中存储id错误?以下是一些原因:

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

答案 1 :(得分:0)

除了其他答案,如果您要控制数据库,则更好的结构是将RegionBranchOffice之间的关系存储在单独的表中,以提供更大的灵活性和更好的性能。 / p>

表格:

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 )
)