SQL 包含 ID 列表的服务器查询列
SQL Server query column containing list of id's
我可能把这个复杂化了,但我正在尝试做一个查询,returns 记录列表(ridlist)中的一个或多个 id 出现在也是列表的列中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。我只想查询 return branchoffice2 的 boid。所以我不认为使用 like % 会起作用。
表:
regions
- rid(ident), regionname, 一些其他列
branchoffices
- boid(ident), rids, city, state, zip, some other columns
示例数据:
区域table(删除,区域名称):
"1", "Dallas/Fort Worth"
"2", "Greater Houston"
"3", "Austin"
"4", "San Antonio"
"5", "San Marcos"
etc
分支机构 table(boid、rids、城市、州、phone):
"1", "2,3", "Houston", "TX", "1231231234"
"2", "1", "Fort Worth", "TX", "4561231234"
"3", "4,5", "San Antonio", "TX", "7891231234"
因此在上面的示例数据中,boid 1(休斯顿办公室)负责大休斯顿和奥斯汀地区。
希望这是有道理的。
非常感谢您提供的任何帮助,如果我错过了已经涵盖的内容,我深表歉意。
您应该有一个单独的 table,每个分支和每个 rid 一行。为什么将 id 存储在字符串中是错误的?以下是一些原因:
rid
是一个整数。它应该存储为整数,而不是字符串。
- 一列(至少使用基本列类型)应该只存储一个值。
- 应该正确声明外键,当值的类型错误时不能这样做。
- SQL 服务器有糟糕的字符串函数(承认吧)。
- SQL 服务器不能很好地优化查询。
- SQL 有这种存储列表的好方法。它被称为 table,而不是 string.
有时,您会被其他人非常、非常、非常糟糕的设计所困。 SQL服务器有个功能可以帮到你,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;
我可能把这个复杂化了,但我正在尝试做一个查询,returns 记录列表(ridlist)中的一个或多个 id 出现在也是列表的列中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。我只想查询 return branchoffice2 的 boid。所以我不认为使用 like % 会起作用。
表:
regions
- rid(ident), regionname, 一些其他列branchoffices
- boid(ident), rids, city, state, zip, some other columns
示例数据:
区域table(删除,区域名称):
"1", "Dallas/Fort Worth"
"2", "Greater Houston"
"3", "Austin"
"4", "San Antonio"
"5", "San Marcos"
etc
分支机构 table(boid、rids、城市、州、phone):
"1", "2,3", "Houston", "TX", "1231231234"
"2", "1", "Fort Worth", "TX", "4561231234"
"3", "4,5", "San Antonio", "TX", "7891231234"
因此在上面的示例数据中,boid 1(休斯顿办公室)负责大休斯顿和奥斯汀地区。
希望这是有道理的。
非常感谢您提供的任何帮助,如果我错过了已经涵盖的内容,我深表歉意。
您应该有一个单独的 table,每个分支和每个 rid 一行。为什么将 id 存储在字符串中是错误的?以下是一些原因:
rid
是一个整数。它应该存储为整数,而不是字符串。- 一列(至少使用基本列类型)应该只存储一个值。
- 应该正确声明外键,当值的类型错误时不能这样做。
- SQL 服务器有糟糕的字符串函数(承认吧)。
- SQL 服务器不能很好地优化查询。
- SQL 有这种存储列表的好方法。它被称为 table,而不是 string.
有时,您会被其他人非常、非常、非常糟糕的设计所困。 SQL服务器有个功能可以帮到你,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;