我可能过于复杂了,但是我试图做一个返回记录的查询,其中一个列表中的一个或多个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(休斯顿办事处)负责大休斯顿和奥斯汀地区。
希望这是有道理的。
非常感谢您提供任何帮助,如果我错过了这项工作,我会道歉。
答案 0 :(得分:1)
你应该有一个单独的表,每个分支和每个rid一行。为什么在字符串中存储id错误?以下是一些原因:
rid
是一个整数。它应该存储为整数,而不是字符串。有时候,你会被别人真正的,非常糟糕的设计所困扰。 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)
除了其他答案,如果您要控制数据库,则更好的结构是将Region
和BranchOffice
之间的关系存储在单独的表中,以提供更大的灵活性和更好的性能。 / 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 )
)