SQL Server 查询列包含 id 列表

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

我可能把这个问题复杂化了,但我正在尝试执行一个查询,该查询返回记录,其中列表(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。我希望查询仅返回branchoffice2 的boid。所以我认为使用像 % 这样的方法是行不通的。

表格:

  • regions - rod(ident)、regionname、其他一些列
  • 分支机构 - boid(ident)、rids、城市、州、邮政编码以及其他一些列

示例数据:

区域表(rid,区域名称):

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

分支机构表(boid、rids、城市、州、电话):

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

因此,在上面的示例数据中,boid 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;

请注意,您还可以在 use 输入上使用 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;

关于SQL Server 查询列包含 id 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50266193/

相关文章:

sql - 如何在第二个连接表中进行多个条件的连接?

json - 使用 FOR JSON PATH 创建嵌套 JSON 数组

sql - ExecuteReader 不返回任何结果,当检查的查询不返回时

sql - 我们在查询中使用 join 的顺序是否会影响其执行时间?

python - 当两个用户同时输入时SQL会覆盖数据(Python)

sql - 将表从一个数据库复制到另一个数据库

sql - Asp.net MVC + 成员资格 + 代码优先 + 现有数据库

javascript - 快速路由器 :id

sql-server - 同一个表上的多个安全谓词 (FILTER|BLOCK)

sql-server - SQL Server 2016 更改对象所有者